最近有同学问我累计器的用法,今天就用 spark 和 flink 各写一个 demo, 其实累计器的场景还是非常多的,比如我们要统计黑名单中数据出现的次数,或者是统计程序处理成功了多少数据,失败了多少数据,所以使用好累计器还是很有必要的.
累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。累加器是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它可以被用来实现计数器和总和。Spark原生地只支持数字类型的累加器,编程者可以添加新类型的支持。如果创建累加器时指定了名字,可以在Spark的UI界面看到。累加器通过对一个初始化了的变量v调用SparkContext.accumulator(v)来创建。
在集群上运行的任务可以通过add或者”+=”方法在累加器上进行累加操作。但是,它们不能读取它的值。只有驱动程序能够读取它的值,通过累加器的value方法。
Spark提供的Accumulator,主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,只能累加,不能减少。累加器只能在Driver端构建,并只能从Driver端读取结果,在Task端只能进行累加。在Task节点,准确的就是说在executor上;
每个Task都会有一个累加器的变量,被序列化传输到executor端运行之后再返回过来都是独立运行的;如果在Task端去获取值的话,只能获取到当前Task的,Task与Task之间不会有影响。累加