从三个方面来分析:1.什么时候使用,2.原理是什么3.性能上有什么优化
累加变量:--(自定义累加器很重要)
使用场景:累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数,如:统计日志中空行数、统计错误行数等;统计电商网站走一步到两步的人有多少,。。。。即步伐的计算;
原理:
task只能对Accumulator进行累加操作,不能读取它的值。
只有Driver程序可以读取Accumulator的值。
性能优化:
因为每个机器上都要对数据进行计算分析,最后要将各个节点计算的数据进行累加,此时如果定义多个变量来对数据进行累加计算,而此时统计起来非常困难,则应该自定义一个整体变量来实现累加;对总体进行累加计算,累加之后返回给客户端,并且这种累加器也只能在客户端读取。
Accumulator可以让多个task共同操作一份变量,主要可以进行累加操作。
广播变量:
使用场景:比如数据库中一份公共配置表格,需要同步给各个节点进行查询
原理:
通过调用SparkContext的broadcast()方法,来针对某个变量创建广播变量。
然后在算子的函数内,使用到广播变量时,每个Excutor只会拷贝一份副本了。每个
节点可以使用广播变量的value()方法获取值。
性能优化:
Broadcast Variable会将使用到的变量,
仅仅为每个Excutor拷贝一份,更大的用处是优化性能,减少网络传输以及内存消耗。
相关地址: