【问题标题】:Spark - Error "A master URL must be set in your configuration" when submitting an appSpark - 提交应用程序时出现错误“必须在您的配置中设置主 URL”
【发布时间】:2016-10-26 18:34:51
【问题描述】:

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

【问题讨论】:

  • 能否请您在此处粘贴您用于提交脚本的命令。
  • 您是否提供了 spark master 网址?
  • @ShivanshSrivastava spark-submit --class GroupEvolutionES --master spark://cluster-node-nn1:7077 --jars $mypath myapp.jar
  • @KSHITIJKULSHRESTHA 是的。
  • 我在我的 Spark 项目的 unit-tests (DataFrameSuiteBase) 中遇到了这个问题。从 @Dazzler 的回答中,我了解到我必须将 DataFrame-creation 移动到 test(..) { .. } 套件中。但也只需DataFrames 声明为lazy 即可解决此问题(喜欢Scala!)。这已被指出是 @gyuseonghis answer 下面

标签: scala apache-spark


【解决方案1】:

我改用了这个 SparkContext 构造函数,错误消失了:

val sc = new SparkContext("local[*]", "MyApp")

【讨论】:

    【解决方案2】:

    通过在本地机器上设置 Spark 上下文来学习 Spark 处理时尝试了此选项。必要的 1)保持 Spark sessionr 在本地运行 2)添加Spark maven依赖 3) 将输入文件保存在 root\input 文件夹中 4) 输出将被放置在 \output 文件夹中。 获得年度最大股票价值。从 yahoo Finance 下载任何 CSV https://in.finance.yahoo.com/quote/CAPPL.BO/history/ 下面是 Maven 依赖和 Scala 代码 -

    <dependencies>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.11</artifactId>
                <version>2.4.3</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>   
    
    object MaxEquityPriceForYear {
      def main(args: Array[String]) {
        val sparkConf = new SparkConf().setAppName("ShareMaxPrice").setMaster("local[2]").set("spark.executor.memory", "1g");
        val sc = new SparkContext(sparkConf);
        val input = "./input/CAPPL.BO.csv"
        val output = "./output"
        sc.textFile(input)
          .map(_.split(","))
          .map(rec => ((rec(0).split("-"))(0).toInt, rec(1).toFloat))
          .reduceByKey((a, b) => Math.max(a, b))
          .saveAsTextFile(output)
      }
    

    【讨论】:

      【解决方案3】:

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

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

      它对我有用!快乐编码!

      【讨论】:

      • 漂亮的帽子。在java中是SparkSession.builder().appName("Simple Application").master("local").getOrCreate();
      【解决方案4】:

      TLDR:

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

      a list of the options for spark.master in spark 2.2.1

      在尝试以本地模式运行一个简单的 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 管理器放置它的地方),或者在提交时在命令行上应用程序。 (例如 spark-submit --master yarn)。

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

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

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

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

      另外,要明确这一点:--master 和“spark.master”是完全相同的参数,只是以不同的方式指定。在代码中设置 spark.master,就像我上面的回答一样,将覆盖设置 --master 的尝试,并将覆盖 spark-defaults.conf 中的值,所以不要在生产中这样做。不过它非常适合测试。

      另见this answer。 链接到a list of the options for spark.master 以及每个链接的实际作用。

      a list of the options for spark.master in spark 2.2.1

      【讨论】:

      • 是的,添加 ".config("spark.master", "local")" 也对我有用。
      • 谢谢这对我有用 - 但有人可以向新手(我)解释 .config("spark.master", "local") 正在做什么吗?我的代码仍然可以编译成 jar 并在生产环境中运行吗?
      • @user1761806 虽然许多答案报告这是一个修复,但它从根本上改变了 spark 处理的方式,只使用一个 JVM。 Local 用于本地测试,如果您打算部署到集群,则不是解决此问题的正确解决方案。我有类似的问题,接受的答案是我的问题的正确解决方案。
      【解决方案5】:

      试试这个

      制作特质

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

      扩展它

      object Preprocess extends SparkSessionWrapper {
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • .setMaster("local") 是我解决问题的关键
        • 如果我设置了它但仍然有这个错误怎么办? @tom10271
        • @AnnaLeonenko 很抱歉,我已经停止开发 Spark 应用程序一年了,我不记得我的记忆了。但我猜你的主节点不是由 spark 而是由 yarn 管理的本地节点?
        • @AnnaLeonenko 我检查了我的设置。当我在本地运行它进行开发并且我只使用Spark来管理主节点时,我将它设置为locallocal[*]。当我将它部署到 AWS EMR 时,它使用 Yarn 进行协调,然后我将 master 设置为 yarn
        【解决方案7】:

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

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

        org.apache.spark.SparkException: A master URL must be set in your configuration”声明 HOST:PORT 未在 spark 配置文件中设置。

        为了不关心“HOST:PORT”的值,将 spark.master 设置为 local

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

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

        参考:Spark Tutorial - Setup Spark Ecosystem

        【讨论】:

        • 非常感谢你拯救了我的一天!
        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          我们缺少要设置的 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()
          

          【讨论】:

            【解决方案10】:

            如果您使用以下代码

             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[*]") * 表示所有节点,您可以说 insted of 8 1,2 etc

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

            【讨论】:

              【解决方案11】:
              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")
              

              【讨论】:

              • 这个解决方案对我有用。谢谢你把它放上来。 @马里奥。
              【解决方案12】:

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

              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[*]")
              

              效果很好!

              【讨论】:

                【解决方案13】:

                替换:

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

                施展魔法。

                【讨论】:

                【解决方案14】:

                替换后为我工作

                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 的其他线程上找到了这个解决方案。

                【讨论】:

                • 先生,您救了我的命...谢谢!
                • 这能解决 OP 的问题吗?这会在这个 JVM 中创建一个本地集群,而不是附加到其他地方的独立集群。
                • 这确实解决了这个问题。我(还)不知道setMaster("local[2]") 的含义(希望能得到解释),但这个答案可以被认为是问题的解决方案。
                • 我刚刚编辑了答案以包含此信息:)
                【解决方案15】:

                您的应用程序中的 spark 上下文如何选择 spark master 的值?

                • 您可以在创建 SC 时通过 SparkConf 明确提供它。
                • 或者从 System.getProperties 中挑选(SparkSubmit 之前在阅读了您的 --master 参数后将其放入)。

                现在,SparkSubmit 在驱动程序上运行——在您的情况下,它是您执行 spark-submit 脚本的机器。这可能对您来说也符合预期。

                但是,从您发布的信息来看,您似乎在发送给执行程序的代码中创建了一个 spark 上下文 - 并且鉴于那里没有可用的 spark.master 系统属性,它会失败。 (如果是这样的话,你真的不应该这样做。)

                能否请您发布GroupEvolutionES 代码(特别是您创建SparkContext(s) 的位置)。

                【讨论】:

                • 是的。我应该在 GroupEvolutionES 的 main 函数中创建 SparkContext(我没有)。
                • 这是一种变通方法而不是解决方案,如果我想创建一个 Singletion Context 并为多个应用程序的 main 函数创建一个单独的 Context 层怎么办?关于我如何实现它的任何 cmet?
                【解决方案16】:

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

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

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

                【讨论】:

                • Spark 确实需要改进:当发生错误时,它只会显示非常混乱且信息不足的错误消息
                • 这是一种变通方法而不是解决方案,如果我想创建一个 Singletion Context 并为多个应用程序的 main 函数创建一个单独的 Context 层怎么办?
                • "请注意,应用程序应定义 main() 方法,而不是扩展 scala.Appscala.App 的子类可能无法正常工作。" Spark 2.1.0 Manual
                • 注意你尝试getOrCreate()的地方应该在驱动程序级别创建上下文并根据需要传递到执行程序级别。
                猜你喜欢
                • 2018-09-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-21
                • 1970-01-01
                • 2017-10-23
                • 1970-01-01
                相关资源
                最近更新 更多