Spark 广播和累加器

Spark 提供广播和累加器两种共享变量的方式:

  • 广播(broadcast),由 Driver 分发数据到 Executor,方向 Driver 到 Executor

  • 累加器(accumulator),由 Executor 聚合数据到 Driver,方向 Executor 到 Driver

广播

广播的旅程:

  1. 在 Driver 创建广播变量
  2. 通过类似 P2P 通讯机制分发到各个 Executor
  3. 广播数据序列化并缓存
  4. 任务执行,反序列化广播数据

使用广播变量过滤数据:

// 创建广播变量
val b = sc.broadcast(Set(1, 4, 7))

// 使用广播变量
sc.parallelize(Seq(1, 2, 3, 4, 5, 6, 7)).filter(!b.value.contains(_)).collect // (2, 3, 5, 6)  

累加器

基础的累加器类型:

  • 整数 long sc.longAccumulator
  • 浮点型 double sc.doubleAccumulator
  • 集合 collection sc.collectAccumulator

使用累加器统计偶数个数:

// 创建 Long 型累加器变量
val even = sc.longAccumulator("even")

// 遍历
sc.parallelize(Seq(1, 2, 3, 4, 5, 6, 7)).foreach(i => if(i % 2 == 0) even.add(1))  
even.value  // 3  

支持自定义累加器类型,继承类 AccumulatorV2