我正在尝试使用apachespark加载一个文件,并将该文件分发到集群中的几个节点,然后聚合结果并获得它们。我不太明白怎么做。
据我所知 reduce
动作使spark能够组合来自不同节点的结果并将它们聚合在一起。我理解得对吗?
从编程的Angular 来看,我不明白如何编写这个reduce函数。
我到底该如何将主数据集划分为n个部分,并通过使用一系列转换要求它们进行并行处理? 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);
另外,我一直试图从apachesparkgithub中找到reduce的源代码,但是源代码非常庞大,我还没有找到它。有人能告诉我在哪个文件里能找到它吗?
1条答案
按热度按时间byqmnocz1#
有很多问题。将来,你应该把它分成多个部分。我会给你一个高水平的答案。
首先,这是带有reduce的文件。第二,你的大部分问题都来自于太多的微观管理(只有在你需要调整性能的时候才有必要)。你首先需要了解spark的核心是什么,rdd是什么。这是一个在引擎盖下平行排列的集合。从编程的Angular 来看,它只是另一个集合。以及
reduce
只是集合中的一个函数,函数编程中的一个常见函数。它所做的只是对所有集合运行一个运算符,将其转换为一个结果,如下所示:最后,在这个例子中,代码只是在数据上运行一个迭代算法来收敛于某个点。这是机器学习算法的一个常见任务。
同样,在您更好地理解高层次的分布式编程之前,我不会关注细节。spark只是一个抽象,可以将这种类型的编程转换回常规代码:)