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...