簡體   English   中英

Spark Scala Seq 追加。 我應該廣播變量嗎?

[英]Spark Scala Seq append. Should I broadcast the variable?

我將一個變量定義為一個空的Seq() ,我將在其中追加來自Map(String, String) rdd 的元素。

變量聲明如下:

var list: Seq[(String, String, String, String, String, String, String, String, String)] = Seq()

然后,遍歷 rdd 元素,我將匹配某個條件的結果附加到 var 列表中。 它是這樣的:

if (condition) {list :+= ("1","2","3","4","5","6","7","8")}

當我在本地嘗試時,我得到了所需的輸出,但是當我嘗試在集群中執行時出現了問題,我得到了空列表。

這似乎不適用於並行計算。 我應該在附加之前廣播變量還是最后用collect()將變量帶到驅動程序?

謝謝 !!

根據火花文檔

通常,當傳遞給 Spark 操作(例如 map 或 reduce)的函數在遠程集群節點上執行時,它會處理函數中使用的所有變量的單獨副本。 這些變量被復制到每台機器上,並且對遠程機器上的變量的更新不會傳播回驅動程序。 支持跨任務的通用讀寫共享變量將是低效的。 但是,Spark 確實為兩種常見的使用模式提供了兩種有限類型的共享變量:廣播變量和累加器。

請看上面文本中突出顯示的部分。 正如它所說,任務/執行程序不會將更改傳播回驅動程序應用程序。 所以你的列表將是空的。

在開始解決之前。 首先,讓我們了解廣播變量和累加器

  1. 廣播變量

廣播變量允許程序員在每台機器上緩存一個只讀變量,而不是隨任務一起傳送它的副本。以這種方式廣播的數據以序列化形式緩存並在運行每個任務之前反序列化。

這些廣播變量是只讀變量,您無法更新它們。 在您的情況下,您正在更新list :+= ("1","2","3","4","5","6","7","8")這是您無法通過廣播實現的

  1. 蓄能器

累加器是僅通過關聯和交換操作“添加”到的變量,因此可以有效地並行支持。 它們可用於實現計數器(如 MapReduce 中)或總和。

您可以使用累加器來完成您的任務。您可以通過擴展AccumulatorV2 API 編寫自定義累加器並將您的列表結構封裝在其中,然后您可以在 spark 上下文sc.register(objectReference, "MyAccumulator")累加器注冊為sc.register(objectReference, "MyAccumulator")

筆記 :

累加器不會改變 Spark 的惰性求值模型。 如果它們在對 RDD 的操作中被更新,則它們的值僅在該 RDD 作為操作的一部分被計算時才會更新。 因此,在諸如 map() 之類的惰性轉換中進行時,不能保證執行累加器更新

暫無
暫無

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

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