apache-spark – Spark聚合函数 – aggregateByKey如何工作?

说我在3个节点上有一个分发系统,我的数据分布在这些节点之间。例如,我有一个test.csv文件,它存在于所有3个节点上,它包含2列:

**row   | id,  c.**
---------------
row1  | k1 , c1  
row2  | k1 , c2  
row3  | k1 , c3  
row4  | k2 , c4  
row5  | k2 , c5  
row6  | k2 , c6  
row7  | k3 , c7  
row8  | k3 , c8  
row9  | k3 , c9  
row10 | k4 , c10   
row11 | k4 , c11  
row12 | k4 , c12 

然后我使用SparkContext.textFile将文件读出为rdd等等。据我了解,每个火花工人节点将从文件中读出一部分。所以现在让我们说每个节点将存储:

>节点1:行1〜4
>节点2:行5〜8
>节点3:第9〜12行

我的问题是让我们想对这些数据进行计算,而且我需要一个组合键,所以键值对将是[k1 [{k1 c1} {k1 c2} {k1 c3 }]].. 等等。

有一个名为groupByKey()的函数,它使用起来非常昂贵,建议使用aggregateByKey()。所以我想知道groupByKey()和aggregateByKey()是如何工作的?有人可以用我上面提供的例子来解释吗?洗牌后,每个节点上的行位于哪里?

aggregateByKey()与reduceByKey()几乎相同(两者都在幕后调用combineByKey()),除了给出aggregateByKey()的起始值。大多数人都熟悉reduceByKey(),所以我将在解释中使用它。

reduceByKey()的好处是因为它使用了一个称为组合器的MapReduce功能。任何类似或*的函数都可以以这种方式使用,因为它所调用的元素的顺序并不重要。这允许Spark使用相同的键启动“减少”值,即使它们并不都在同一个分区中。

另一方面,GroupByKey()给你更多的多样性,因为你编写一个需要一个Iterable的函数,这意味着你甚至可以将所有的元素都拉到一个数组中。然而,它是无效的,因为它工作的全套(K,V,)对必须在一个分区。

在减少类型操作上移动数据的步骤通常被称为随机播放,在最简单的级别,数据被分割到每个节点(通常具有散列分区器),然后在每个节点上排序。

http://stackoverflow.com/questions/24804619/how-does-spark-aggregate-function-aggregatebykey-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:apache-spark – Spark聚合函数 – aggregateByKey如何工作?