2016-08-14 121 views
1

有關Spark 2.0支持多個SparkContext s的大量討論。支持它的配置變量已經存在了很長時間,但實際上並不有效。在Spark 2.0中實際取消了單個SparkContext的限制嗎?

$SPARK_HOME/conf/spark-defaults.conf

spark.driver.allowMultipleContexts true 

我們來驗證一下屬性被確認:

scala>  println(s"allowMultiCtx = ${sc.getConf.get("spark.driver.allowMultipleContexts")}") 
allowMultiCtx = true 

這裏是它的一個小的POC程序:

import org.apache.spark._ 
import org.apache.spark.streaming._ 
println(s"allowMultiCtx = ${sc.getConf.get("spark.driver.allowMultipleContexts")}") 
def createAndStartFileStream(dir: String) = { 
    val sc = new SparkContext("local[1]",s"Spark-$dir" /*,conf*/) 
    val ssc = new StreamingContext(sc, Seconds(4)) 
    val dstream = ssc.textFileStream(dir) 
    val valuesCounts = dstream.countByValue() 
    ssc.start 
    ssc.awaitTermination 
} 
val dirs = Seq("data10m", "data50m", "dataSmall").map { d => 
    s"/shared/demo/data/$d" 
} 
dirs.foreach{ d => 
    createAndStartFileStream(d) 
} 

但是嘗試使用當該能力不成功:

16/08/14 11:38:55 WARN SparkContext: Multiple running SparkContexts detected 
in the same JVM! 
org.apache.spark.SparkException: Only one SparkContext may be running in 
this JVM (see SPARK-2243). To ignore this error, 
set spark.driver.allowMultipleContexts = true. 
The currently running SparkContext was created at: 
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:814) 
org.apache.spark.repl.Main$.createSparkSession(Main.scala:95) 

任何人都有關於如何使用多個上下文的見解?

+2

SPARK-2243的分辨率是不會修復的,所以它看起來像答案是「不,它不會」。 – 2016-08-14 19:28:55

+0

@LostInOverflow請創建一個答案 - 你應該得到認可。我已經添加了Sean Owen的具體細節,他是這個東西的大佬。 – javadba

回答

2

Per @LostInOverflow此功能不會被修復。下面是從JIRA信息

SPARK-2243支持在同一個JVM多SparkContexts

https://issues.apache.org/jira/browse/SPARK-2243

肖恩·歐文發表了評論 - 16 /月/ 16 17:35你假設您關心的是 ,並且過度利用集羣來執行不需要太多資源的步驟。這是動態分配的原因:執行器的數量隨着負載的增加而減少。如果一個上下文已經使用了所有羣集資源,那麼它就不會執行任何操作。但是, 既沒有第二個上下文;該羣集已被完全使用。 I 不知道你指的是什麼開銷,但肯定有一個 運行N個作業的上下文比運行N個作業的N個上下文更繁忙。其 開銷較高,但總開銷較低。這是一個 效果比可以讓你選擇另一個架構而不是 的原因更有效。一般來說,Spark總是假定每個JVM都有一個上下文,我看不到這種變化,這就是爲什麼我最終關閉了這個。我不會 看到任何支持,使這種情況發生。

相關問題