问题的引出:
需求:求取某一批数据个数(条数)
如图:假如有十条数据,当我们进行累加计算的时候,假设两个分区Executer进行计算得到5,但是Driver所记录的count和两个Executer计算的结果是无关,因此当我们最后调用collect()方法收集结果的时候,结果却显示0,这显然不符合我们的预想结果。因此便引出了Spark累加器。
Spark累加器的介绍:
使用方法(PySpark):将对象标记为累加器对象
语法:
conf = SparkConf().setAppName("syx_test").setMaster("yarn")
sc = SparkContext(conf=conf)
#原先为 count = 0 ,括号的0代表初始值
acc_count = sc.accumulator(0)
新的问题:
由于RDD是过程数据,也就是下一个RDD产生,上一个RDD就灭亡了,且RDD之间存在血缘关系。那么当出现新的RDD向上一个RDD重新调用的情况下,RDD就会去溯源(也就是返回第一步重新生成上一个RDD),随之而来的问题就是在这个溯源的过程中,我们定义的acc_count也就会再次累加一次,显然这也不是我们想要的结果。
解决方案:
将我们需要再次调用的RDD存入缓存或者checkpoint。