我有一个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
答案 0 :(得分:84)
TLDR:
.config("spark.master", "local")
a list of the options for spark.master in spark 2.2.1
在尝试以本地模式运行简单的Spark SQL java程序后,我最终在此页面上。为此,我发现我可以使用:
设置spark.masterSparkSession 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以及每个人实际执行的操作。
答案 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
的格式列表的链接答案 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的值?
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);