Spark十 累加器与广播变量

两种类型的共享变量:累加器(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选择序列化库

猜你喜欢

转载自blog.csdn.net/weixin_42129080/article/details/80950261