簡體   English   中英

Scala / Spark:為什么在本地和群集中使用廣播運行spark程序時為什么會得到不同的結果?

[英]Scala/Spark: Why I get different result when I run spark program in local and cluster using broadcast?

我有一個DataFrame,我想獲取先前分區的值,我使用廣播。這是我的代碼:

val arr = Array((1, 1,1), (7, 2,1), (3, 3,2), (5, 4,2), (7, 5,3), (9, 6,3), (7, 7,4), (9, 8,4))
    var rdd = sc.parallelize(arr, 4)
    val bro=sc.broadcast(new mutable.HashMap[Int,Int])
     rdd=rdd.mapPartitionsWithIndex(
         (partIdx, iter) => {
           val iterArray=iter.toArray
           bro.value+=(partIdx->iterArray.last._1)
           iterArray.toIterator
         })
   rdd=rdd.mapPartitionsWithIndex(
     (partIdx, iter) => {
       val iterArray = iter.toArray
       var flag=true
       if(partIdx!=0) {
         while (flag) {
           if (bro.value.contains(partIdx - 1)) {
             flag = false
           }
         }
         println(bro.value.get(partIdx-1).get)
       }

       iter
     })
rdd.collect()

在第一個mapPartitionsWithIndex函數中,我將每個分區的值廣播;在第二個mapPartitionsWithIndex函數中,我得到廣播的值。 該代碼在本地運行良好,但是在群集中不起作用,該程序無法獲取先前分區的值,為什么在本地和群集中使用廣播運行spark程序時卻得到不同的結果?

您得到不同的結果,因為您的代碼不正確。 Broadcasted對象不得修改

廣播變量使程序員可以在每台計算機上保留一個只讀變量,而不用隨任務一起發送它的副本。

之所以可行,是因為您利用了local模式的實現細節,所有線程都在一台機器上運行。 這使其類似於理解閉包中描述的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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