我在尝试处理群集上的大量数据时遇到了麻烦。
代码:
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。
答案 0 :(得分:2)
TL; DR 没有。 Spark没有具有同步访问权限的共享内存,因此不存在真正的全局访问。
&#34;共享&#34;的唯一形式Spark中的可写变量是Accumulator
。它允许只具有交换和关联功能的只写访问。
由于其实施等同于reduce
/ aggregate
:
它无法解决您的问题。