Spark - 提交应用程序时出现错误"必须在配置中设置主URL"

Shu*_*ang 79 scala apache-spark

我有一个Spark应用程序在本地模式下运行没有问题,但在提交到Spark集群时有一些问题.

错误消息如下:

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)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,GroupEvolutionES是主类.错误消息msg说"必须在配置中设置主URL",但我已经提供了"--master"参数spark-submit.

有谁知道如何解决这个问题?

Spark版本:1.6.1

Jac*_*son 105

在尝试以本地模式运行简单的Spark SQL java程序后,我最终在此页面上.为此,我发现我可以使用以下命令设置spark.master:

.config("spark.master", "local")
Run Code Online (Sandbox Code Playgroud)

我的回答更新:

需要说明的是,这不是您在生产环境中应该做的事情.在生产环境中,应该在其他几个地方指定spark.master:在$ SPARK_HOME/conf/spark-defaults.conf中(这是cloudera管理器将放置它的地方),或者在提交时在命令行上该应用程序.(ex spark-submit --master yarn).

如果您以这种方式将spark.master指定为"local",则spark将尝试在单个jvm中运行,如下面的注释所示.如果您随后尝试指定--deploy-mode cluster,则会收到错误"群集部署模式与主"本地"不兼容.这是因为设置spark.master = local意味着您不是在群集模式下运行.

相反,对于生产应用程序,在主函数内(或在主函数调用的函数中),您应该只使用:

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

这将使用命令行/在配置文件中指定的配置.

另外,要清楚这一点: - master和"spark.master"是完全相同的参数,只是以不同的方式指定.在代码中设置spark.master,就像我上面的回答一样,将覆盖设置--master的尝试,并将覆盖spark-defaults.conf中的值,因此不要在生产中执行.它非常适合测试.

另外,看到这个答案.它链接到spark.master的选项列表以及每个实际执行的操作.

spark 2.2.1中spark.master的选项列表

  • 是的,添加".config("spark.master","local")"也为我工作. (5认同)
  • @ user1761806虽然许多答案都将此作为修复报告,但它从根本上改变了spark进程的方式,只使用了一个JVM.本地用于本地测试,如果您打算部署到群集,则不是解决此问题的正确解决方案.我有类似的问题,接受的答案是我的问题的正确解决方案. (3认同)

小智 55

更换后为我工作

SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");
Run Code Online (Sandbox Code Playgroud)

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

在stackoverflow上的其他一些线程上找到此解决方案.

  • 这是否解决了OP的问题?这将在此JVM中创建本地群集,而不是附加到其他位置的独立群集. (3认同)

Daz*_*ler 37

sparkContext对象在哪里定义,它是在main函数里面吗?

我也面临同样的问题,我做的错误是我在main函数和类内部启动了sparkContext.

当我在main函数中启动它时,它运行正常.

  • Spark确实需要改进:它只是在发生错误时显示非常混乱且无法提供信息的错误消息 (7认同)
  • 这是一种解决方法而不是解决方案,如果我想创建一个Singletion Context并为多个应用程序创建一个单独的Context层而不是main函数怎么办? (2认同)

Mal*_*n M 26

"spark.master"的默认值是spark:// HOST:PORT,以下代码尝试从在HOST:PORT上运行的独立集群中获取会话,并期望HOST:PORT值位于spark配置文件.

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .getOrCreate();
Run Code Online (Sandbox Code Playgroud)

" org.apache.spark.SparkException:必须在配置中设置主URL "说明火花配置文件中未设置HOST:PORT.

为了不打扰"HOST:PORT"的值,请将spark.master设置为local

SparkSession spark = SparkSession
    .builder()
    .appName("SomeAppName")
    .config("spark.master", "local")
    .getOrCreate();
Run Code Online (Sandbox Code Playgroud)

以下是可以将主URL传递给spark.master的格式列表的链接

参考:Spark教程 - 设置Spark生态系统


小智 9

只需添加.setMaster("local")到您的代码中,如下所示:

val conf = new SparkConf().setAppName("Second").setMaster("local") 
Run Code Online (Sandbox Code Playgroud)

它对我有用!快乐编码!


Sas*_*san 7

如果您正在运行一个独立的应用程序,那么您必须使用SparkContext而不是SparkSession

val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
Run Code Online (Sandbox Code Playgroud)

  • `.setMaster("local")` 是我解决问题的关键 (7认同)