Spark - Erro “Um URL mestre deve ser definido em sua configuração” ao enviar um aplicativo

92

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

Shuai Zhang
fonte
1
Você poderia colar aqui o comando que está usando para enviar o script.
Shiv4nsh
Você forneceu o URL mestre do Spark?
Kshitij Kulshrestha
@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark: // cluster-node-nn1: 7077 --jars $ mypath myapp.jar
Shuai Zhang
@KSHITIJKULSHRESTHA Sim.
Shuai Zhang
Eu encontrei isso nos testesSpark de unidade do meu projeto ( DataFrameSuiteBase). De @Dazzler resposta 's, entendi que deve mover DataFrame-Criação dentro test(..) { .. }suites. Mas também apenas declarar DataFrameque estálazy corrigido (amor Scala!). Isso foi apontado por @gyuseong em sua resposta abaixo
y2k-shubham

Respostas:

39

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.

Dazzler
fonte
11
O Spark realmente precisa melhorar: ele apenas mostra mensagens de erro muito confusas e pouco informativas quando algo errado acontece
Shuai Zhang
3
Esta é uma solução alternativa e não uma solução. E se eu quiser criar um Contexto Singletion e criar uma camada separada de Contexto além da função principal para vários aplicativos?
Murtaza Kanchwala
1
"Observe que os aplicativos devem definir um main()método em vez de estender scala.App. As subclasses de scala.Apppodem não funcionar corretamente." Spark 2.1.0 Manual
ruhong
Preste atenção onde você tenta, getOrCreate()um contexto deve ser criado no nível do driver e passado para o nível do executor, conforme necessário.
reim de
130

O TLDR:

.config("spark.master", "local")

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:

SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.master", "local")
.getOrCreate();

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:

SparkSession
.builder()
.appName("Java Spark SQL basic example")
.getOrCreate();

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

Jack Davidson
fonte
5
sim, adicionar ".config (" spark.master "," local ")" funcionou para mim também.
Ashutosh S
Obrigado, isso funcionou para mim - mas alguém poderia explicar a um novato (eu) o que o .config ("spark.master", "local") está fazendo? Meu código ainda estará bom para compilar em um jar e rodar em produção?
user1761806
4
@ user1761806 embora muitas das respostas relatem isso como uma correção, ele muda fundamentalmente a maneira como os processos de ativação são feitos, usando apenas uma única JVM. Local é usado para teste local e não é a solução correta para corrigir esse problema se você pretende implantar em um cluster. Tive problemas semelhantes e a resposta aceita foi a solução correta para o meu problema.
Nathaniel Wendt
58

Funcionou para mim após a substituição

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");

com

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Encontrei esta solução em algum outro thread no stackoverflow.

Sachin
fonte
1
Senhor, salvou meu dia ... Obrigado!
Hako
3
Isso resolve a questão do OP? Isso cria um cluster local neste JVM, não anexado a um independente em outro lugar.
Azeroth2b
Isso resolve o problema. Não sei (ainda) sobre as implicações de setMaster("local[2]")(seria bom ter uma explicação), mas essa resposta pode ser considerada a solução para o problema.
Rick
Acabei de editar a resposta para incluir essas informações :)
Rick
26

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.

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .getOrCreate();

" 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

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .config("spark.master", "local")
    .getOrCreate();

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

Mallikarjun M
fonte
Muito obrigado, você salvou meu dia!
GentleCoder
6

Se você estiver executando um aplicativo independente, você deve usar em SparkContextvez deSparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Sasikumar Murugesan
fonte
5
.setMaster("local")é a chave para resolver o problema para mim
tom10271
E se eu tiver definido, mas ainda tiver esse erro? @ tom10271
Anna Leonenko
@AnnaLeonenko Sinto muito, mas parei de desenvolver o aplicativo Spark há um ano, não consigo me lembrar. Mas eu acho que seu nó mestre não é local, que é gerenciado por faísca, mas yarn?
tom10271
1
@AnnaLeonenko Eu verifiquei minhas configurações. Quando eu estava executando-o localmente para desenvolvimento e só uso o Spark para gerenciar o nó mestre, vou defini-lo como localou local[*]. Quando eu implanto no AWS EMR, ele usa Yarn para coordenação, então eu defino o mestre comoyarn
tom10271
6

basta adicionar .setMaster("local")ao seu código conforme mostrado abaixo:

val conf = new SparkConf().setAppName("Second").setMaster("local") 

Funcionou para mim! Boa codificação!

Kumar Sanu
fonte
3

Como o contexto do spark em seu aplicativo escolhe o valor para o spark master?

  • Você quer fornecer explicitamente dentro de SparkConf durante a criação do SC.
  • Ou seleciona System.getProperties(onde SparkSubmit o colocou antes de ler seu --masterargumento).

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 GroupEvolutionEScódigo (especificamente onde você está criando SparkContext(s)).

Sachin Tyagi
fonte
1
Sim. Deveria ter criado o SparkContext nas mainfunções de GroupEvolutionES (o que não fiz).
Shuai Zhang
1
Esta é uma solução alternativa e não uma solução. E se eu quiser criar um Contexto Singletion e criar uma camada separada de Contexto além da função principal para vários aplicativos? Algum comentário sobre como posso conseguir isso?
Murtaza Kanchwala
2

Substituindo:

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");
WITH
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");

Fez a mágica.

Nazima
fonte
5
A sua solução não é exatamente a mesma que a @Sachin postou?
Akavall de
por que local [2] você pode explicar
SUDARSHAN
sobre local [2] -> stackoverflow.com/questions/32356143/…
raevilman
2

Eu tive o mesmo problema, aqui está meu código antes da modificação:

package com.asagaama

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD

/**
  * Created by asagaama on 16/02/2017.
  */
object Word {

  def countWords(sc: SparkContext) = {
    // Load our input data
    val input = sc.textFile("/Users/Documents/spark/testscase/test/test.txt")
    // Split it up into words
    val words = input.flatMap(line => line.split(" "))
    // Transform into pairs and count
    val counts = words.map(word => (word, 1)).reduceByKey { case (x, y) => x + y }
    // Save the word count back out to a text file, causing evaluation.
    counts.saveAsTextFile("/Users/Documents/spark/testscase/test/result.txt")
  }

  def main(args: Array[String]) = {
    val conf = new SparkConf().setAppName("wordCount")
    val sc = new SparkContext(conf)
    countWords(sc)
  }

}

E depois de substituir:

val conf = new SparkConf().setAppName("wordCount")

Com:

val conf = new SparkConf().setAppName("wordCount").setMaster("local[*]")

Funcionou bem!


fonte
2
var appName:String ="test"
val conf = new SparkConf().setAppName(appName).setMaster("local[*]").set("spark.executor.memory","1g");
val sc =  SparkContext.getOrCreate(conf)
sc.setLogLevel("WARN")
rio
fonte
Essa solução foi o que funcionou para mim. Obrigado por colocá-lo. @Mario.
Siwoku Adeola
2

tente isso

fazer traço

import org.apache.spark.sql.SparkSession
trait SparkSessionWrapper {
   lazy val spark:SparkSession = {
      SparkSession
        .builder()
        .getOrCreate()
    }
}

estende isso

object Preprocess extends SparkSessionWrapper {
Gyuseong
fonte
1

Está faltando o setMaster ("local [*]") para definir. Depois de adicionarmos, o problema será resolvido.

Problema:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .getOrCreate()

solução:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .master("local[*]")
      .getOrCreate()
KARTHIKEYAN.A
fonte
0

Se você estiver usando o seguinte código

 val sc = new SparkContext(master, "WordCount", System.getenv("SPARK_HOME"))

Em seguida, substitua pelas seguintes linhas

  val jobName = "WordCount";
  val conf = new SparkConf().setAppName(jobName);
  val sc = new SparkContext(conf)

No Spark 2.0, você pode usar o seguinte código

val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .master("local[*]")// need to add
  .getOrCreate()

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

vaquar khan
fonte
0

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);

Rimi Gandhi
fonte