广播变量
广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。
Spark还尝试使用高效地广播算法来分发变量,进而减少通信的开销。Spark动作通过一组阶段执行,由分布式“shuffle”操作分隔.Spark自动广播每个阶段中任务所需的公共数据.以这种方式广播的数据以序列化形式缓存并在运行每个任务之前反序列化.这意味着显式创建广播变量仅在跨多个阶段的任务需要相同数据或以反序列化形式缓存数据很重要时才有用.
累加器
累加器用来对信息进行聚合,通常在向 Spark 传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使 用驱 动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本, 更新这些副本的值 也不会影响驱动器中的对应变量。 如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们 想要的效果。
注意:
1,广播变量是一个只读变量,在driver端定义后,在excetors端只能读它的值,不能修改.
2,累加器在Driver端定义赋初始值,累加器只能在Driver端读取最后的值,在Excutor端更新.在driver端获取累计器值的时候需要一个action操作来触发,才能拿到值,并且累计器只能增加,不能减少.