spark累加器和广播变量

Spark 计算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于 处理不同的应用场景。三大数据结构分别是:

RDD : 弹性分布式数据集

累加器:分布式共享只写变量

广播变量:分布式共享只读变量

累加器

累加器用来把 Executor 端(执行者)变量信息聚合到 Driver 端。在 Driver 程序中定义的变量,在 Executor 端的每个 Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后, 传回 Driver 端进行 merge(合并)。

spark累加器和广播变量_第1张图片

 

系统累加器

spark默认就提供了简单的数据聚合的累加器

系统内置累加器(SystemAccumulators)是Spark提供的一种特殊类型的变量,它们是只写变量(write-only),只能被Worker节点累加(Accumulate),而Driver节点不能读取它们的值。系统累加器的主要作用是提供一种在分布式环境下进行计数或者计算的方式,尤其是在调试、性能优化和任务监控方面非常有用。

  • LongAccumulator:用于计算整数值的累加器。
  • DoubleAccumulator:用于计算浮点数值的累加器。
  • CollectionAccumulator:用于收集对象的累加器,可以通过集合的方式返回结果。

spark累加器和广播变量_第2张图片

自定义累加器

  • 自定义累加器在Spark中进行自定义聚合计算的一种方式。
  • 自定义累加器需要继承Spark的AccumulatorV2抽象类,该类有四个泛型参数,分别是输入类型、中间类型、输出类型和累加器自身类型。其中,输入类型是指累加器每次接收到的输入数据类型,中间类型是指累加器在进行数据累加时所使用的的中间变量类型,输出类型是指累加器最终输出结果的类型,而累加器自身类型则是指累加器类型本身。
  • 自定义累加器需要实现AccumulatorV2中的五个抽象方法:reset、add、merge、value和copy。其中,reset方法用于初始化累加器,add方法用于将输入数据累加到中间变量中,merge方法用于合并不同分区中的中间变量,value方法用于获取累加器的当前值,copy方法用于创建累加器的副本。

spark累加器和广播变量_第3张图片

spark累加器和广播变量_第4张图片

广播变量

广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个 Spark 操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表, 广播变量用起来都很顺手。在多个并行操作中使用同一个变量,但是 Spark 会为每个任务 分别发送。

spark累加器和广播变量_第5张图片

实现原理:

  1. 在Driver节点上创建一个对象,这个对象需要在Executor节点上使用。
  2. 将这个对象序列化成一个字节数组,并将这个字节数组发送给每个Executor节点。
  3. 每个Executor节点收到字节数组后,将其反序列化为一个对象,并将其存储在内存中,以便在任务知情期间使用。
  4. 在任务执行期间,Executor节点上的任务可以使用这个广播变量。

spark累加器和广播变量_第6张图片

 

你可能感兴趣的:(spark,大数据,分布式)