2016-06-24 27 views
46

我有一個Spark應用程序,在本地模式下運行時沒有問題,但在提交到Spark羣集時遇到一些問題。提交應用程序時出現Spark - 錯誤「您的配置中必須設置主URL」

的錯誤味精如下:

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」,但我提供了「--master」參數​​。

任何人都知道如何解決這個問題?

星火版本:1.6.1

+0

您能否在此粘貼您用於提交腳本的命令。 –

+0

您是否提供了spark master URL? –

+0

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

回答

23

哪裏sparkContext對象定義,它是main函數中?

我也面臨同樣的問題,我所做的錯誤是我在主函數和類內部啓動了sparkContext。

當我在主函數中啓動它時,它工作正常。

+0

Spark真的需要改進:當錯誤發生時,它只顯示非常混亂和無意義的錯誤消息 –

+2

這是一種解決方法,而不是一種解決方案,如果我想創建一個Singletion上下文並創建與主函數分開的獨立層上下文爲多個應用程序? –

+1

「請注意,應用程序應該定義一個'main()'方法,而不是擴展'scala.App','scala.App'的子類可能無法正常工作。 [Spark 2.1.0 Manual](http://spark.apache.org/docs/latest/quick-start.html#self-contained-applications) – ruhong

3

應用程序中的火花上下文如何爲火花主控選擇值?

  • 您可以在創建SC時用SparkConf明確提供它。
  • 或者從System.getProperties中選擇(其中SparkSubmit在閱讀--master參數後提及它)。

現在,SparkSubmit運行在驅動程序上 - 在您的情況下,您正在執行​​腳本的機器。這可能也是按照您的預期工作。

但是,從您發佈的信息看來,您似乎是在發送給執行程序的代碼中創建了一個spark上下文 - 並且假設沒有可用的系統屬性spark.master,它將失敗。 (如果發生這種情況,你不應該這麼做)。

你可以發佈GroupEvolutionES代碼(特別是你在創建的地方SparkContext(s))。

+1

是的。我應該在GroupEvolutionES的'main'函數中創建SparkContext(我沒有)。 –

+1

這是一個解決方法,而不是一個解決方案,如果我想創建一個單一上下文併爲多個應用程序的主函數分開創建一個獨立的上下文層,該怎麼辦?有關我如何實現它的任何意見? –

45

我試圖在本地模式下運行一個簡單的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.master爲'local',則spark將嘗試在單個jvm中運行,如下面的註釋所示。如果您嘗試指定--deploy-mode羣集,則會出現錯誤「羣集部署模式與主服務器」local「不兼容」。這是因爲設置了火花。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

+2

是的,加入 「.config(」spark.master「,」local「)」也適用於我。 – ashu17188

+0

感謝這爲我工作 - 但可能有人向新手(我)解釋.config(「spark.master」,「本地」)在做什麼?我的代碼仍然可以編譯成jar並運行在生產環境中嗎? – user1761806

+2

@ user1761806雖然許多答案報告這是一個修復,但它從根本上改變了spark過程的方式,只使用單個JVM。 Local用於本地測試,如果打算部署到羣集,則不是解決此問題的正確解決方案。我有類似的問題,接受的答案是我的問題的正確解決方案。 –

46

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

找到關於計算器其他線程該解決方案取代

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

後爲我工作。

+1

你先生,救了我的一天......謝謝! – Hako

+1

這是否解決了OP的問題?這會在此JVM中創建本地羣集,而不會附加到其他位置的獨立羣集中。 – Azeroth2b

+0

這確實解決了這個問題。我還不知道setMaster(「local [2]」)的含義(可以很好地解釋),但這個答案可以被認爲是解決問題的方法。 – Rick

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

做的魔術。

+5

難道您的解決方案與@Sachin發佈的內容完全相同嗎? – Akavall

+0

爲什麼地方[2]你能解釋 – SUDARSHAN

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

它工作得很好!

14

「spark.master」的缺省值爲spark:// HOST:PORT,並且以下代碼嘗試從運行在的獨立羣集中獲取會話:主機:端口,並且期望HOST: PORT值將位於spark配置文件中。

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

org.apache.spark.SparkException:主URL必須在配置設置」指出HOST:PORT沒有火花配置文件中設置。

要理會的值「HOST:PORT」,設置spark.master當地

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

Here是,其中主URL可以傳遞給火花的鏈接的格式列表。掌握

+0

非常感謝你救了我的一天! – GentleCoder

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) 

在星火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 [*]」)if乳寧本地這裏*表示全部節點,你可以說insted的8個1,2等

您需要設置主URL如果集羣

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

這個解決方案對我來說非常有用。感謝您的支持。 @Mario。 –

0

我們缺少setMaster(「本地[*] 「)設置。一旦我們添加,然後問題得到解決。

問題:

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

如果不提供JavaSparkContext星火配置,那麼你得到這個錯誤。 即: JavaSparkContext sc = new JavaSparkContext();

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

相關問題