Spark Accumulator 陷阱及解決辦法

2022-08-10 14:54:14 字數 2105 閱讀 3073

accumulator簡介

accumulator是spark提供的累加器,顧名思義,該變數只能夠增加。 

只有driver能獲取到accumulator的值(使用value方法),task只能對其做增加操作(使用 +=)。你也可以在為accumulator命名(不支援python),這樣就會在spark web ui中顯示,可以幫助你了解程式執行的情況。

accumulator使用

使用示例

舉個最簡單的accumulator的使用例子:

//在driver中定義

val accum = sc.accumulator(0, "example

accumulator")

//在task中進行累加

sc.parallelize(1 to 10).foreach(x=> accum += 1)

//在driver中輸出

accum.value

//結果將返回10

res: 10

累加器的錯誤用法

val accum= sc.accumulator(0, "error

accumulator")

val data = sc.parallelize(1 to 10)

//用accumulator統計偶數出現的次數,同時偶數返回0,奇數返回1

val newdata = data.mapelse 1

}}//使用action操作觸發執行

newdata.count

//此時accum的值為5,是我們要的結果

accum.value

//繼續操作,檢視剛才變動的資料,foreach也是action操作

newdata.foreach(println)

//上個步驟沒有進行累計器操作,可是累加器此時的結果已經是10了

//這並不是我們想要的結果

accum.value

原因分析

官方對這個問題的解釋如下描述:

for accumulator updates performed inside actions

restarted tasks will not update the value. in transformations, users should be

than once if tasks or job stages are re-executed.

我們都知道,spark中的一系列transform操作會構成一串長的任務鏈,此時需要通過乙個action操作來觸發,accumulator也是一樣。因此在乙個action操作之前,你呼叫value方法檢視其數值,肯定是沒有任何變化的。

所以在第一次count(action操作)之後,我們發現累加器的數值變成了5,是我們要的答案。

之後又對新產生的的newdata進行了一次foreach(action操作),其實這個時候又執行了一次map(transform)操作,所以累加器又增加了5。最終獲得的結果變成了10。

解決辦法

看了上面的分析,大家都有這種印象了,那就是使用累加器的過程中只能使用一次action的操作才能保證結果的準確性。

事實上,還是有解決方案的,只要將任務之間的依賴關係切斷就可以了。什麼方法有這種功能呢?你們肯定都想到了,cache,persist。呼叫這個方法的時候會將之前的依賴切除,後續的累加器就不會再被之前的transfrom操作影響到了。

//val accum= sc.accumulator(0, "error

accumulator")

val data = sc.parallelize(1 to 10)

//**和上方相同

val newdata = data.map}

//使用cache快取資料,切斷依賴。

newdata.cache.count

//此時accum的值為5

accum.value

newdata.foreach(println)

//此時的accum依舊是5

accum.value

總結

使用accumulator時,為了保證準確性,只使用一次action操作。如果需要使用多次則使用cache或persist操作切斷依賴。

mysqlleftright練習及解決辦法

在accounts 中,有乙個列儲存的是每個公司的 最後三個數字表示他們使用的是什麼型別的 此處給出了擴充套件 和 列表。請獲取這些擴充套件並得出accounts 中每個 型別的存在數量。對於公司名稱 甚至名稱的第乙個字母 的作用存在頗多爭議 請從 e3 80 82 e8 af b7 e4 bb 8...

firefox快速重新整理error及解決辦法

問題 測試發過來bug,說 頻繁f5重新整理頁面,會閃現未載入完樣式的頁面 開發用的chrome,沒發現這個問題,測試用的firefox,於是從瀏覽器的重新整理載入機制方面搜尋解決辦法,沒搜到,運氣好,最後找到了解決辦法 firefox下頻繁f5重新整理還有個問題 可能ajax未請求完成就重新整理了...

Could not launch app 解決辦法

xcode 的bug 解決方法一 targets general signing 下重新勾選automatically manage signing 解決方法二 1 拔掉裝置,刪除之前build的內容 2 退出xcode,不是關閉視窗 3,刪除下面目錄下的資料夾 users library deve...