在 Apache Spark 中,广播变量与累加器各自扮演什么角色?请解释二者的核心差异,并分别举例说明它们适用的典型业务场景。
考察说明
考察对 Spark 两种共享变量机制的理解深度及实际应用能力。
回答思路
- 【回答框架 1】广播变量是只读的共享变量,用于将大表或配置数据分发到所有 executor,每个 executor 只保留一份副本,通过高效的广播算法(如 TreeBroadcast)减少网络传输和内存占用。累加器是可写的共享变量,仅支持累加操作,主要用于实现计数器或求和,且只能在 driver 端读取最终值。
- 【回答框架 2】核心区别在于读写权限和用途:广播变量是只读的,所有 task 共享同一份数据,适合优化 join 或 map 操作中重复使用的静态数据;累加器是只写(从 executor 视角)的,只能执行加法等操作,用于统计任务处理量、错误次数等指标。
- 【回答框架 3】在场景应用上,广播变量典型用于小表 join 大表时,将小表广播到各节点,避免 shuffle 开销;累加器典型用于日志分析中统计处理的总记录数、满足特定条件的记录数或异常数量,例如统计过滤后的有效数据条数。
- 【回答框架 4】使用时需注意:广播变量修改后不会自动更新,需重新广播;累加器在 action 算子中才能保证精确累加,在 transformation 算子中可能因任务重试导致重复累加。
- 【关键点 1】广播变量只读,每个 executor 一份,用于优化数据分发;累加器只写,用于计数器。
- 【关键点 2】广播变量适合小表广播场景,可减少 shuffle 和网络 IO。
- 【关键点 3】累加器只在 action 算子中触发精确累加,transformation 中可能重复累加。
- 【易错点 1】不能在 executor 端读取累加器的值,只能在 driver 端获取最终结果。
- 【易错点 2】广播变量更新后需要重新广播,否则旧副本继续使用。
- 【易错点 3】累加器在 transformation 中执行时,任务重试或推测执行可能导致计数不准确。