两种类型的共享变量:累加器(accumulator)和广播变量(broadcast variable)
共享变量是在Spark任务中使用的特殊类型变量
累加器用来聚合信息
1) 提供将工作节点的值累加到驱动器程序的语法
2) 常见用途是调试时对作业执行过程的事件计数
3) 工作节点的任务不能访问累加器的值,只有驱动器程序中可以访问
4) 累加器的用法
> 驱动器中调用SparkContext.accumulator(initialValue)创建有初始值的累加器,返回值为org.apache.spark.Accumulator
> Spark闭包中执行器可以使用累加器+=增加累加器的值
> 驱动器程序调用累加器的value属性访问累加器的值
累加器与容错性
1) 如何处理出错任务的累加器?
> 行动操作中,任务只能修改一次累加器的值,如果任务成功,则修改,任务不成功,则未修改
> 转化操作的累加器只能不止一次更新,即转化操作谱系图的重算等,导致累加器不准确,转化操作中的累加器只用来调试
自定义累加器
1) Int, Double,Long,Float
2) 扩展AccumulatorParam
3) 操作满足交换律和结合律,如Sum和Max
广播变量用来高效分发大对象
1) 让程序高效地向所有工作节点发送一个较大的只读值,供一个或多个Spark操作使用
2) Spark会自动把闭包中所有引用到的变量发送到工作节点上,但这是针对小任务的
3) 广播变量的用法
> SparkContext.broadcast(T Object),创建一个org.apache.spark.broadcat.Broadcast[T],可序列化就可以实现
> value属性访问值
> 只发送一次变量到各个节点,作为只读值
广播优化
1) 广播比较大的对象时,要选择又快又好的序列化方式
2) Scala和Java API都默认使用Java序列化库,除了基本数据类型,都比较低效
3) 可以使用org.apache.spark.serializer选择序列化库