![](/img/trans.png)
[英]SBT gives java.lang.NullPointerException when trying to run spark
[英]java.lang.NullPointerException when launch spark job to a standalone cluster
我有以下代碼:
val spark = SparkSession.builder
.appName("Simple Application")
.master("spark://myserver.com:7077")
//.master("local[*]") //notice this line
.getOrCreate()
val sc = spark.sparkContext
val arr: RDD[(Int, Int)] = sc.parallelize(Array( 1->2 , 3 -> 4, 5 -> 4, 1->2 , 3 -> 4, 5 -> 4,7 -> 8))
val arr2: RDD[(Int, String)] = sc.parallelize(Array( 1->"a" , 2 -> "b", 3 -> "c"))
val map = arr2.take(arr2.count().toInt).toMap
val result1 = arr map { case (a,b) =>
if ( map.contains(a) ) map(a) -> b
else "other" -> b
}
result1 take 100000 foreach println
當我將其啟動到spark://myserver.com:7077
,出現錯誤: if ( map.contains(a) ) ...
行處出現java.lang.NullPointerException
if ( map.contains(a) ) ...
結果證明對象map
為null。 但是,當我使用'.master(“ local [*]”')啟動它時,它可以正常工作。
我在同一節點上啟動了一個主服務器和一個從服務器。 為什么我會收到NullPointerException
?
在集群模式下 ,當您將變量聲明為map
val map = arr2.take(arr2.count().toInt).toMap
僅在驅動程序節點中可訪問它,並且在 執行映射函數調用時未將其映射到每個執行程序節點中
val result1 = arr map { case (a,b) =>
if ( map.contains(a) ) map(a) -> b
else "other" -> b
}
因此,執行者節點將無法識別什么是映射變量 。 您將必須找到一種將map變量分發到執行程序節點的方法。 一種方法是用作廣播變量 (如果變量引用的數據足夠小),然后在map
函數中使用它,以便執行程序可以在需要時調用它們。
val map = sc.broadcast(arr2.take(arr2.count().toInt).toMap)
val result1 = arr map { case (a,b) =>
if ( map.value.contains(a) ) map.value(a) -> b
else "other" -> b
}
我希望答案是有幫助的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.