在 Apache Spark 中使用 Reduce

Using Reduce in Apache Spark

我正在尝试使用 Apache spark 加载一个文件,并将该文件分发到我集群中的多个节点,然后聚合结果并获取它们。我不太明白该怎么做。

根据我的理解,reduce 操作使 Spark 能够组合来自不同节点的结果并将它们聚合在一起。我理解正确吗?

从编程的角度来看,我不明白如何编写这个 reduce 函数。

  1. 如何将主数据集划分为 N 个部分,并使用转换列表要求它们并行处理?

  2. reduce 应该接受两个元素和一个组合它们的函数。这两个元素应该是 Spark 上下文中的 RDD,还是可以是任何类型的元素?另外,如果你有 N 个不同的分区 运行 并行,如何将它们的所有结果聚合为一个最终结果(因为 reduce 函数只聚合 2 个元素)?

另外,我不明白这个例子。来自 spark 网站的示例使用 reduce,但我没有看到并行处理的数据。那么,减少的重点是什么?如果我能得到这个例子中循环的详细解释,我想我的大部分问题都会迎刃而解。

class ComputeGradient extends Function<DataPoint, Vector> {
  private Vector w;
  ComputeGradient(Vector w) { this.w = w; }
  public Vector call(DataPoint p) {
    return p.x.times(p.y * (1 / (1 + Math.exp(w.dot(p.x))) - 1));
  }
}

JavaRDD<DataPoint> points = spark.textFile(...).map(new ParsePoint()).cache();
Vector w = Vector.random(D); // current separating plane
for (int i = 0; i < ITERATIONS; i++) {
  Vector gradient = points.map(new ComputeGradient(w)).reduce(new AddVectors());
  w = w.subtract(gradient);
}
System.out.println("Final separating plane: " + w);

此外,我一直试图从 Apache Spark Github 中找到 reduce 的源代码,但源代码非常庞大,我无法准确定位。有人可以指导我在哪个文件中找到它吗?

这是很多问题。将来,您应该将其分解为多个。我会给出一个应该为你回答的高水平。

首先,here is the file with reduce。 其次,您的大部分问题都来自于尝试进行过多的微观管理(只有在需要性能调整时才有必要)。您需要首先了解什么是 Spark 的核心以及什么是 RDD。它是一个在引擎盖下并行化的集合。从您的编程角度来看,它只是另一个集合。 reduce 只是该集合上的一个函数,是函数式编程中的常见函数。它所做的只是 运行 一个针对您所有集合的运算符,将其变成如下所示的一个结果:

((item1 op item2) op item3) op ....

最后,在示例中,代码只是 运行对数据进行迭代算法以收敛于某个点。这是机器学习算法的常见任务。

同样,在您更好地理解高级分布式编程之前,我不会关注细节。 Spark 只是将这种类型的编程转换回常规代码的顶层抽象:)