本文基于Spark2.1.0版本
今天整理累加器的知識(shí)點(diǎn)時(shí),發(fā)現(xiàn)實(shí)例化一個(gè)Accumulator對(duì)象卓囚,編譯無(wú)法通過(guò):
查了一下Spark2.x的API,發(fā)現(xiàn)對(duì)Accumulator類(lèi)的定義發(fā)生了變化:
新的累加器創(chuàng)建的方法如下:
可以看出哪亿,新版的累加器有了如下的改良:
1粥烁,不用傳初始化值參數(shù),默認(rèn)是從0開(kāi)始蝇棉;
2讨阻,創(chuàng)建累加器時(shí),可以指定累加器的名字银萍,這樣在Driver 4040 Web UI的Task顯示時(shí)变勇,可以看到該名字的累加器在各Task中的實(shí)際的值(如果不指定累加器名字,則不會(huì)在Web UI上顯示)-- ?這點(diǎn)我說(shuō)的不準(zhǔn)確贴唇,舊的累加器類(lèi)也有這個(gè)功能搀绣,只不過(guò)我一直沒(méi)用過(guò),慚愧戳气。链患。。
3瓶您,新增了reset方法麻捻,可以重置該累加器歸零(還有幾個(gè)新的方法纲仍,不一一舉例)
So,按照API的指示贸毕,修改如下:
在Driver 的4040 Web UI上觀察,發(fā)現(xiàn)Task table增加了 Accumulators 列明棍,能看到每個(gè)Task上的叫做ErrorCnt 的累加器的值(可以同時(shí)定義多個(gè)累加器)
迭代器使用起來(lái)很簡(jiǎn)單乡革,很方便,但在使用過(guò)程中一定要注意(新手容易忽略):
因?yàn)镾park 相同的Task有可能被重復(fù)執(zhí)行多次(容錯(cuò)性導(dǎo)致)摊腋,所以累加器的值很有可能被累加多次沸版,那么得到的結(jié)果就不準(zhǔn)確了,所以一般把累加器放在行動(dòng)操作中來(lái)使用兴蒸,只有這樣视粮,Spark才會(huì)把每個(gè)任務(wù)對(duì)各累加器的修改應(yīng)用一次。
下面舉一個(gè)foreach的行動(dòng)操作的例子:
java代碼如下: