Eu tenho um aplicativo Spark que é executado sem problemas no modo local, mas tenho alguns problemas ao enviar para o cluster Spark.
As mensagens de erro são as seguintes:
16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 2.0 in stage 0.0 (TID 2, cluster-node-02): java.lang.ExceptionInInitializerError
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.spark.SparkException: A master URL must be set in your configuration
at org.apache.spark.SparkContext.<init>(SparkContext.scala:401)
at GroupEvolutionES$.<init>(GroupEvolutionES.scala:37)
at GroupEvolutionES$.<clinit>(GroupEvolutionES.scala)
... 14 more
16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 5.0 in stage 0.0 (TID 5, cluster-node-02): java.lang.NoClassDefFoundError: Could not initialize class GroupEvolutionES$
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
No código acima, GroupEvolutionES
é a classe principal. A mensagem de erro diz "Um URL mestre deve ser definido em sua configuração", mas eu forneci o parâmetro "--master" para spark-submit
.
Alguém que sabe consertar esse problema?
Versão do Spark: 1.6.1
scala
apache-spark
Shuai Zhang
fonte
fonte
Spark
de unidade do meu projeto (DataFrameSuiteBase
). De @Dazzler resposta 's, entendi que deve moverDataFrame
-Criação dentrotest(..) { .. }
suites. Mas também apenas declararDataFrame
que estálazy
corrigido (amorScala
!). Isso foi apontado por @gyuseong em sua resposta abaixoRespostas:
Onde o objeto sparkContext está definido, ele está dentro da função principal?
Eu também enfrentei o mesmo problema, o erro que cometi foi iniciar o sparkContext fora da função principal e dentro da classe.
Quando o iniciei dentro da função principal, funcionou bem.
fonte
main()
método em vez de estenderscala.App
. As subclasses descala.App
podem não funcionar corretamente." Spark 2.1.0 ManualgetOrCreate()
um contexto deve ser criado no nível do driver e passado para o nível do executor, conforme necessário.O TLDR:
uma lista das opções para spark.master no spark 2.2.1
Acabei nesta página depois de tentar executar um programa simples Spark SQL java no modo local. Para fazer isso, descobri que poderia definir spark.master usando:
Uma atualização para minha resposta:
Para ser claro, isso não é o que você deve fazer em um ambiente de produção. Em um ambiente de produção, spark.master deve ser especificado em um de alguns outros lugares: em $ SPARK_HOME / conf / spark-defaults.conf (é aqui que o cloudera manager irá colocá-lo) ou na linha de comando quando você enviar a aplicação. (ex spark-submit --master yarn).
Se você especificar spark.master como 'local' dessa forma, o spark tentará ser executado em um único jvm, conforme indicado pelos comentários abaixo. Se você tentar especificar o cluster --deploy-mode, receberá um erro 'O modo de implementação do cluster não é compatível com o master "local"'. Isso ocorre porque configurar spark.master = local significa que você NÃO está executando no modo de cluster.
Em vez disso, para um aplicativo de produção, dentro de sua função principal (ou em funções chamadas por sua função principal), você deve simplesmente usar:
Isso usará as configurações especificadas na linha de comando / em arquivos de configuração.
Além disso, para ser claro: --master e "spark.master" são exatamente o mesmo parâmetro, apenas especificados de maneiras diferentes. Definir spark.master no código, como na minha resposta acima, irá substituir as tentativas de definir --master e irá substituir os valores em spark-defaults.conf, então não faça isso na produção. É ótimo para testes.
também, veja esta resposta . que vincula a uma lista de opções para spark.master e o que cada uma realmente faz.
uma lista das opções para spark.master no spark 2.2.1
fonte
Funcionou para mim após a substituição
com
Encontrei esta solução em algum outro thread no stackoverflow.
fonte
setMaster("local[2]")
(seria bom ter uma explicação), mas essa resposta pode ser considerada a solução para o problema.O valor padrão de "spark.master" é spark: // HOST: PORT, e o código a seguir tenta obter uma sessão do cluster autônomo que está sendo executado em HOST: PORT e espera que o valor HOST: PORT esteja no arquivo de configuração do spark.
" org.apache.spark.SparkException: Um URL mestre deve ser definido em sua configuração " afirma que HOST: PORT não está definido no arquivo de configuração do spark.
Para não se preocupar com o valor de "HOST: PORT", defina spark.master como local
Aqui está o link para a lista de formatos nos quais o URL mestre pode ser passado para spark.master
Referência: Tutorial do Spark - Configurar ecossistema do Spark
fonte
Se você estiver executando um aplicativo independente, você deve usar em
SparkContext
vez deSparkSession
fonte
.setMaster("local")
é a chave para resolver o problema para mimlocal
oulocal[*]
. Quando eu implanto no AWS EMR, ele usa Yarn para coordenação, então eu defino o mestre comoyarn
basta adicionar
.setMaster("local")
ao seu código conforme mostrado abaixo:Funcionou para mim! Boa codificação!
fonte
Como o contexto do spark em seu aplicativo escolhe o valor para o spark master?
SparkConf
durante a criação do SC.System.getProperties
(onde SparkSubmit o colocou antes de ler seu--master
argumento).Agora,
SparkSubmit
é executado no driver - que no seu caso é a máquina de onde você está executando ospark-submit
script. E isso provavelmente está funcionando conforme o esperado para você também.No entanto, a partir das informações que você postou, parece que você está criando um contexto de faísca no código que é enviado ao executor - e dado que não há
spark.master
propriedade de sistema disponível lá, ele falha. (E você realmente não deveria estar fazendo isso, se for o caso.)Você pode postar o
GroupEvolutionES
código (especificamente onde você está criandoSparkContext(s)
).fonte
main
funções de GroupEvolutionES (o que não fiz).Substituindo:
Fez a mágica.
fonte
Eu tive o mesmo problema, aqui está meu código antes da modificação:
E depois de substituir:
Com:
Funcionou bem!
fonte
fonte
tente isso
fazer traço
estende isso
fonte
Está faltando o setMaster ("local [*]") para definir. Depois de adicionarmos, o problema será resolvido.
Problema:
solução:
fonte
Se você estiver usando o seguinte código
Em seguida, substitua pelas seguintes linhas
No Spark 2.0, você pode usar o seguinte código
Você precisa adicionar .master ("local [*]") se a execução local aqui * significa todos os nós, você pode dizer em vez de 8 1,2 etc
Você precisa definir o URL mestre se estiver no cluster
fonte
Se você não fornecer a configuração do Spark em JavaSparkContext, receberá este erro. Ou seja: JavaSparkContext sc = new JavaSparkContext ();
Solução: Forneça JavaSparkContext sc = new JavaSparkContext (conf);
fonte