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


93

我有一个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)

在上面的代码中,GroupEvolutionES是主类。错误消息味精说:“必须在您的配置中设置一个主URL”,但是我已经为设置了“ --master”参数spark-submit

知道如何解决此问题的人吗?

Spark版本:1.6.1


1
您能否将用于粘贴脚本的命令粘贴到此处。
Shiv4nsh

您提供了spark master URL吗?
Kshitij Kulshrestha '16

@ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark:// cluster-node-nn1:7077 --jars $ mypath myapp.jar
Shuai Zhang,

@KSHITIJKULSHRESTHA是的。
帅张

我在Spark项目的单元测试DataFrameSuiteBase)中遇到了这个问题。从@Dazzler的答案中,我了解到必须DataFrametest(..) { .. }套件内移动-creation 。但也只是声明DataFrames可以lazy解决它(爱Scala!)。这已经指出是@gyuseong他的答案如下
2000年-shubham

Answers:


40

sparkContext对象在哪里定义,它是否在main函数中?

我也遇到了同样的问题,我做的错误是我在主函数和类内部启动了sparkContext。

当我在main函数中启动它时,它运行良好。


11
Spark确实需要改进:当发生错误时,它只会显示非常令人困惑和无意义的错误消息
Shuai Zhang

3
这是一种解决方法,而不是解决方案,如果我想创建一个Singletion Context并创建一个单独的Context层,而不是多个应用程序的主要功能,该怎么办?
Murtaza Kanchwala

1
“请注意,应用程序应定义main()方法而不是扩展scala.App。的子类scala.App可能无法正常工作。” Spark 2.1.0手册
茹宏

请注意,尝试在哪里尝试getOrCreate()上下文应在驱动程序级别创建,并根据需要传递到执行程序级别。

131

TLDR:

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

spark 2.2.1中spark.master的选项列表

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

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

我的答案的更新:

需要明确的是,这不是在生产环境中应该执行的操作。在生产环境中,应在其他两个位置之一指定spark.master:在$ SPARK_HOME / conf / spark-defaults.conf中(这是cloudera manager放置的位置),或在提交时在命令行上该应用程序。(例如火花提交-主纱)。

如果您以这种方式将spark.master指定为“本地”,spark将尝试在单个jvm中运行,如下面的注释所示。如果然后尝试指定--deploy-mode群集,则会收到错误消息“群集部署模式与主服务器“本地”不兼容”。这是因为设置spark.master = local表示您不在集群模式下运行。

相反,对于生产应用程序,在您的主要功能内(或在主要功能调用的功能内),您应该简单地使用:

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

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

同样,也要清楚一点:--master和“ spark.master”是完全相同的参数,只是以不同的方式指定。像在上面的答案中一样,在代码中设置spark.master会覆盖设置--master的尝试,并且会覆盖spark-defaults.conf中的值,因此请勿在生产中使用。它非常适合测试。

另外,请参阅此答案。链接到spark.master的选项列表以及每个选项的实际作用。

spark 2.2.1中spark.master的选项列表


5
是的,添加“ .config(” spark.master“,” local“)”对我也有效。
Ashutosh S

谢谢这对我有用-但是有人可以向新手(我)解释.config(“ spark.master”,“ local”)在做什么吗?将我的代码编译成jar并在生产中运行是否还可以?
user1761806

4
@ user1761806尽管许多答案都将此作为修复,但它从根本上改变了仅使用单个JVM触发火花的方式。本地用于本地测试,如果要部署到群集,则不是解决此问题的正确解决方案。我遇到了类似的问题,被接受的答案是解决我的问题的正确方法。
纳撒尼尔·温特

58

更换后为我工作

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

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

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


1
先生,您保存了我的一天...谢谢!
哈科

3
这是否解决了OP的问题?这将在此JVM中创建本地集群,而不是附加到其他独立集群。
Azeroth2b

这确实解决了问题。我尚不知道(setMaster("local[2]")可能会很高兴提供一个解释)的含义,但是可以将此答案视为该问题的解决方案。
里克

我只是编辑了答案以包含此信息:)
Rick

26

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

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

org.apache.spark.SparkException:必须在您的配置中设置主URL ”,指出未在spark配置文件中设置HOST:PORT

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

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

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

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


非常感谢您保存了我的一天!
GentleCoder

6

如果您运行的是独立应用程序,则必须使用SparkContext而不是SparkSession

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

5
.setMaster("local")是为我解决问题的关键
tom10271 '18

如果已设置但仍然出现此错误怎么办?@ tom10271
安娜·列昂年科

@AnnaLeonenko对不起,但我已经停止开发Spark应用程序一年了,我不记得我的记忆了。但是我想您的主节点不是本地的,由火花而是由纱线管理的?
tom10271

1
@AnnaLeonenko我已经检查了我的设置。当我在本地运行它进行开发时,仅使用Spark管理主节点时,将其设置为locallocal[*]。当我将其部署到AWS EMR时,它使用Yarn进行协调,然后将master设置为yarn
tom10271

6

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

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

它为我工作!编码愉快!


3

应用程序中的Spark上下文如何选择Spark Master的值?

  • SparkConf创建SC时,您可以随意提供它。
  • 或从中选择System.getProperties(SparkSubmit在阅读您的--master参数后将其放在前面的位置)。

现在,SparkSubmit在驱动程序上运行-在您的情况下,这是您要在其中执行spark-submit脚本的计算机。而且这可能也可以满足您的预期。

但是,从您发布的信息来看,您似乎在发送给执行者的代码中创建了一个Spark上下文-鉴于没有 spark.master可用的系统属性,因此它将失败。(如果是这种情况,则您实际上不应该这样做。)

您能否发布GroupEvolutionES代码(特别是在创建代码的地方SparkContext(s))。


1
是。我应该在GroupEvolutionES的main函数中创建了SparkContext (我没有)。
张帅

1
这是一种解决方法,而不是解决方案,如果我想创建一个Singletion Context并创建一个单独的Context层,而不是多个应用程序的主要功能,该怎么办?关于如何实现它有什么意见吗?
Murtaza Kanchwala


2

我有同样的问题,这是修改之前的代码:

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

}

并在更换后:

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

与:

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

工作正常!


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

这个解决方案对我有用。感谢您提出。@Mario。
Siwoku Adeola '18

2

试试这个

做特质

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

扩展它

object Preprocess extends SparkSessionWrapper {

1

我们缺少要设置的setMaster(“ local [*]”)。一旦添加,问题便得到解决。

问题:

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

解:

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

0

如果您使用以下代码

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

然后替换为以下几行

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

在Spark 2.0中,您可以使用以下代码

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

如果在此处运行本地,则需要添加.master(“ local [*]”)*表示所有节点,可以说是8 1,2等

如果在群集上,则需要设置主URL


0

如果未在JavaSparkContext中提供Spark配置,则会出现此错误。即:JavaSparkContext sc = new JavaSparkContext();

解决方案:提供JavaSparkContext sc = new JavaSparkContext(conf);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.