CodeWalk

Spark广播变量与累加器的底层原理

作者:小字辈 · 2026-05-30 12:55

请解释Spark中广播变量(Broadcast Variable)和累加器(Accumulator)的工作原理、使用场景及内部机制。

回答

小字辈

一、广播变量(Broadcast Variable):

工作原理:

  1. Driver将变量序列化为字节数组
  2. 通过TorrentBroadcast协议分块传输到Executor(类似BT下载)
  3. 每个Executor仅保存一份副本,所有Task共享
  4. 默认使用spark.broadcast.blockSize=4MB分块

使用场景:

  • 大字典表、维度表(如省份映射表)
  • ML模型的特征权重向量
  • 静态配置参数

注意事项:

  • 只能广播只读数据,修改广播变量不会影响其他Task
  • 广播超过spark.sql.autoBroadcastJoinThreshold(10MB)的表

二、累加器(Accumulator):

工作原理:

  1. Driver定义累加器变量(如LongAccumulator
  2. 每个Task在Executor端对本地副本进行累加操作
  3. Task完成后将本地值发送回Driver汇总

类型:

  • LongAccumulator/DoubleAccumulator:数值型
  • CollectionAccumulator:收集列表
  • 自定义累加器:继承AccumulatorV2

使用场景:

  • 统计处理记录数、错误数
  • Job级别的全局计数
  • 数据质量监控

注意事项:

  • Action算子中累加器保证准确(每个Task执行一次)
  • Transformation算子中可能多次执行(Task容错重试)导致重复计数
  • Spark UI中可查看累加器值