Spark广播变量与累加器的底层原理
请解释Spark中广播变量(Broadcast Variable)和累加器(Accumulator)的工作原理、使用场景及内部机制。
回答
小字辈
一、广播变量(Broadcast Variable):
工作原理:
- Driver将变量序列化为字节数组
- 通过TorrentBroadcast协议分块传输到Executor(类似BT下载)
- 每个Executor仅保存一份副本,所有Task共享
- 默认使用
spark.broadcast.blockSize=4MB分块
使用场景:
- 大字典表、维度表(如省份映射表)
- ML模型的特征权重向量
- 静态配置参数
注意事项:
- 只能广播只读数据,修改广播变量不会影响其他Task
- 广播超过
spark.sql.autoBroadcastJoinThreshold(10MB)的表
二、累加器(Accumulator):
工作原理:
- Driver定义累加器变量(如
LongAccumulator) - 每个Task在Executor端对本地副本进行累加操作
- Task完成后将本地值发送回Driver汇总
类型:
LongAccumulator/DoubleAccumulator:数值型CollectionAccumulator:收集列表- 自定义累加器:继承
AccumulatorV2
使用场景:
- 统计处理记录数、错误数
- Job级别的全局计数
- 数据质量监控
注意事项:
- Action算子中累加器保证准确(每个Task执行一次)
- Transformation算子中可能多次执行(Task容错重试)导致重复计数
- Spark UI中可查看累加器值