【发布时间】:2018-05-04 14:00:28
【问题描述】:
我在尝试处理集群上的大量数据时遇到了麻烦。
代码:
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 个块(x0、x1、x2, x3) 使所有进程独立。每个进程产生一个输出(z0、z1、z2、z3),最后z的值是这4个结果的平均值。
这种方法有效,但精度(和计算时间)受分区数量的影响。
我的问题是,是否有一种方法可以生成一个“全局”z,它将从每个进程(分区)中更新。
【问题讨论】:
-
this.update(c, v)是做什么的?精确度如何受到影响?您似乎使用了Long,所以 FP 问题不适用。 -
@user9613318 代码已被简化为具有足够的说明性而没有提供太多细节。在实际例子中,v是一个向量,z是一个包含v的每个维度的梯度的向量。
标签: scala apache-spark distributed-computing