Spark - 提交应用时出现错误“必须在配置中设置主网址”

时间:2016-06-24 07:52:37

标签: 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)

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

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

Spark版本:1.6.1

16 个答案:

答案 0 :(得分:84)

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管理器将放置的位置),或者在提交时在命令行上该应用程序。 (ex spark-submit --master yarn)。

如果您指定spark.master为本地&#39;通过这种方式,spark将尝试在单个jvm中运行,如下面的注释所示。如果您随后尝试指定--deploy-mode cluster,则会出现错误&#39;群集部署模式与master&#34; local&#34;&#39;不兼容。这是因为设置spark.master = local意味着您没有以群集模式运行。

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

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

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

另外,要明确这一点: - master和&#34; spark.master&#34;是完全相同的参数,只是以不同的方式指定。在代码中设置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

答案 1 :(得分:52)

替换后为我工作

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

答案 2 :(得分:34)

定义了sparkContext对象的位置,它是在main函数中吗?

我也面临同样的问题,我做的错误是我在主要功能之外和课堂内启动了sparkContext。

当我在main函数中启动它时,它工作正常。

答案 3 :(得分:26)

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

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

&#34; org.apache.spark.SparkException:必须在配置中设置主URL &#34;声明火花配置文件中未设置 HOST:PORT

为了不打扰&#34; HOST:PORT&#34;的价值,将 spark.master 设为本地

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

Here是可以将主网址传递给spark.master

的格式列表的链接

参考:Spark Tutorial - Setup Spark Ecosystem

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

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

  • 您可以在创建SC时使用SparkConf提供explcitly。
  • 或者它从System.getProperties中选择(SparkSubmit之前在阅读--master参数后放置它)。

现在,SparkSubmit在驱动程序上运行 - 在您的情况下是您执行spark-submit脚本的机器。这也许正如你所期望的那样。

但是,根据您发布的信息,您似乎在发送给执行程序的代码中创建了一个spark上下文 - 并且假设此处没有spark.master系统属性,则它失败。 (如果是这种情况,你不应该这样做。)

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

答案 6 :(得分:3)

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

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

对我有用!编码愉快!

答案 7 :(得分:2)

更换:

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

神奇了吗。

答案 8 :(得分: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[*]")

工作得很好!

答案 9 :(得分: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")

答案 10 :(得分:2)

尝试

制造特质

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

扩展它

object Preprocess extends SparkSessionWrapper {

答案 11 :(得分:1)

我们缺少要设置的 setMaster(&#34; local [*]&#34;)。一旦我们添加,问题就会得到解决。

<强>问题:

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

答案 12 :(得分: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个等等的内容

您需要在群集

上设置主URL

答案 13 :(得分:0)

在通过本地计算机设置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)
  }

答案 14 :(得分:0)

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

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

答案 15 :(得分:-1)

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

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