在Spark中,groupByKey函数将一(K,V)
对RDD转换为一(K,Iterable
对RDD.
然而,这个功能稳定吗?ie是从原始顺序保留的可迭代顺序?
例如,如果我最初读取表单的文件:
K1;V11 K2;V21 K1;V12
我的迭代K1
可能是(V12, V11)
(因此不保留原始顺序)或者只能是(V11, V12)
(因此保留原始顺序)?
不,订单不会保留.示例spark-shell
:
scala> sc.parallelize(Seq(0->1, 0->2), 2).groupByKey.collect res0: Array[(Int, Iterable[Int])] = Array((0,ArrayBuffer(2, 1)))
顺序取决于时间,因此它可以在运行之间变化.(我下一次跑步时的顺序相反.)
这里发生了什么?groupByKey
通过使用a重新分区RDD来工作HashPartitioner
,以便键的所有值在同一分区中结束.然后它在每个分区上本地执行聚合.
重新分区也称为"shuffle",因为RDD的行在节点之间重新分配.随机文件从其他节点并行拉出.新分区是按照它们到达的顺序从这些部分构建的.来自最慢源的数据将位于新分区的末尾,并位于列表的末尾groupByKey
.
(从工作人员本身提取的数据当然是最快的.因为这里没有涉及网络传输,所以这些数据被同步拉出,因此按顺序到达.(至少看来.)所以为了复制我的实验,你需要在至少2名火花工人.)
资料来源:http://apache-spark-user-list.1001560.n3.nabble.com/Is-shuffle-quot-stable-quot-td7628.html