分布式流程更新Spark

时间:2018-05-04 14:00:28

标签: scala apache-spark distributed-computing

我在尝试处理群集上的大量数据时遇到了麻烦。

代码:

val (sumZ, batchSize) = data.rdd.repartition(4)
  .treeAggregate(0L, 0L))(
    seqOp = (c, v) => {
      // c: (z, count), v
      val step = this.update(c, v)
      (step._1, c._2 + 1)
    },
    combOp = (c1, c2) => {
      // c: (z, count)
      (c1._1 + c2._1, c1._2 + c2._2)
    })

val finalZ = sumZ / 4

正如您在代码中看到的,我当前的方法是将此数据分区为4个块(x 0 ,x 1 ,x 2 < / sub>,x 3 )使所有过程独立。每个过程生成一个输出(z 0 ,z 1 ,z 2 ,z 3 ),最后一个z的值是这4个结果的平均值。

此方法正在运行,但精度(和计算时间)受分区数量的影响。

我的问题是否有一种方法可以生成将从每个进程(分区)更新的“全局”z。

1 个答案:

答案 0 :(得分:2)

TL; DR 没有。 Spark没有具有同步访问权限的共享内存,因此不存在真正的全局访问。

&#34;共享&#34;的唯一形式Spark中的可写变量是Accumulator。它允许只具有交换和关联功能的只写访问。

由于其实施等同于reduce / aggregate

  • 每个分区都有自己的副本,可以在本地更新。
  • 任务完成后,将部分结果发送给驱动程序并与&#34; global&#34;实例

它无法解决您的问题。