真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解

這期內容當中小編將會給大家?guī)碛嘘P大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

為薩爾圖等地區(qū)用戶提供了全套網頁設計制作服務,及薩爾圖網站建設行業(yè)解決方案。主營業(yè)務為成都網站設計、成都做網站、薩爾圖網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

Spark 累加器與廣播變量

一、簡介

在 Spark 中,提供了兩種類型的共享變量:累加器 (accumulator) 與廣播變量 (broadcast variable):

  • 累加器:用來對信息進行聚合,主要用于累計計數等場景;

  • 廣播變量:主要用于在節(jié)點間高效分發(fā)大對象。

二、累加器

這里先看一個具體的場景,對于正常的累計求和,如果在集群模式中使用下面的代碼進行計算,會發(fā)現執(zhí)行結果并非預期:

var counter = 0
val data = Array(1, 2, 3, 4, 5)
sc.parallelize(data).foreach(x => counter += x)
 println(counter)

counter 最后的結果是 0,導致這個問題的主要原因是閉包。

大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解

2.1 理解閉包

1. Scala 中閉包的概念

這里先介紹一下 Scala 中關于閉包的概念:

var more = 10
val addMore = (x: Int) => x + more

如上函數 addMore 中有兩個變量 x 和 more:

  • x: 是一個綁定變量 (bound variable),因為其是該函數的入參,在函數的上下文中有明確的定義;

  • more: 是一個自由變量 (free variable),因為函數字面量本生并沒有給 more 賦予任何含義。

按照定義:在創(chuàng)建函數時,如果需要捕獲自由變量,那么包含指向被捕獲變量的引用的函數就被稱為閉包函數。

2. Spark 中的閉包

也可以參考:https://blog.csdn.net/hu_lichao/article/details/112451982

在實際計算時,Spark 會將對 RDD 操作分解為 Task,Task 運行在 Worker Node 上。在執(zhí)行之前,Spark 會對任務進行閉包,如果閉包內涉及到自由變量,則程序會進行拷貝,并將副本變量放在閉包中,之后閉包被序列化并發(fā)送給每個執(zhí)行者。因此,當在 foreach 函數中引用 counter 時,它將不再是 Driver 節(jié)點上的 counter,而是閉包中的副本 counter,默認情況下,副本 counter 更新后的值不會回傳到 Driver,所以 counter 的最終值仍然為零。

需要注意的是:在 Local 模式下,有可能執(zhí)行 foreach 的 Worker Node 與 Diver 處在相同的 JVM,并引用相同的原始 counter,這時候更新可能是正確的,但是在集群模式下一定不正確。所以在遇到此類問題時應優(yōu)先使用累加器。

累加器的原理實際上很簡單:就是將每個副本變量的最終值傳回 Driver,由 Driver 聚合后得到最終值,并更新原始變量。

大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解

2.2 使用累加器

SparkContext 中定義了所有創(chuàng)建累加器的方法,需要注意的是:被中橫線劃掉的累加器方法在 Spark 2.0.0 之后被標識為廢棄。

使用示例和執(zhí)行結果分別如下:

val data = Array(1, 2, 3, 4, 5)
// 定義累加器
val accum = sc.longAccumulator("My Accumulator")
sc.parallelize(data).foreach(x => accum.add(x))
// 獲取累加器的值
accum.value

三、廣播變量

在上面介紹中閉包的過程中我們說道每個 Task 任務的閉包都會持有自由變量的副本,如果變量很大且 Task 任務很多的情況下,這必然會對網絡 IO 造成壓力,為了解決這個情況,Spark 提供了廣播變量。

廣播變量的做法很簡單:就是不把副本變量分發(fā)到每個 Task 中,而是將其分發(fā)到每個 Executor,Executor 中的所有 Task 共享一個副本變量。

// 把一個數組定義為一個廣播變量
val broadcastVar = sc.broadcast(Array(1, 2, 3, 4, 5))
// 之后用到該數組時應優(yōu)先使用廣播變量,而不是原值
sc.parallelize(broadcastVar.value).map(_ * 10).collect()

四、觀察變量

創(chuàng)建的Accumulator變量的值能夠在Spark Web UI上看到,在創(chuàng)建時應該盡量為其命名,下面探討如何在Spark Web UI上查看累加器的值

大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解

上述就是小編為大家分享的大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道。


文章題目:大數據開發(fā)中Spark共享變量的累加器和廣播變量怎么理解
網站網址:http://weahome.cn/article/popsos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部