簡體   English   中英

將Spark作業啟動到獨立集群時發生java.lang.NullPointerException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM