【问题标题】:Distributed process updating a global/single variable in Spark分布式进程更新 Spark 中的全局/单个变量
【发布时间】: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


【解决方案1】:

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

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

由于其实现等价于reduce/aggregate

  • 每个分区都有自己的副本,在本地更新。
  • 任务完成后,部分结果将发送到驱动程序并与“全局”实例结合。

它不会解决你的问题。

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多