【问题标题】:Using Reduce in Apache Spark在 Apache Spark 中使用 Reduce
【发布时间】:2015-05-06 23:01:10
【问题描述】:

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

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

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

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

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

另外,我不明白这个例子。 spark 网站上的示例使用reduce,但我没有看到并行处理的数据。那么,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 的源代码,但源代码非常庞大,我无法确定它。有人可以指导我在哪个文件中找到它吗?

【问题讨论】:

    标签: hadoop apache-spark reduce


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢!我想我仍然不清楚引擎盖下并行化是如何工作的。如果我有一个 RDD 并在获得某种结果并尝试减少之前应用 X 个不同的转换,它是如何并行化的?我是否需要提供有关我的集群节点 IP 的信息,以便它可以将处理委托给它?
    • 您在提交时处理,通常通过 spark-submit 工具完成
    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2016-06-19
    相关资源
    最近更新 更多