2016-09-28 90 views
0

我有一个巨大的RDD,我想在本地对各个分区进行排序。我查看了sortByKey操作,但不清楚它是否调用洗牌。 (我想避免洗牌)Spark中的sortByKey是否会调用shuffle?

Cloudera blog它提到sortByKey会涉及洗牌,但从sortByKey的javadoc,它看起来像没有洗牌,直到collect()被调用。

问题:sortByKey()是否涉及洗牌数据?如果是,那么在每个RDD分区中排序数据的最佳方法是什么?如果不是,那么collect()如何使全局排序?

+0

Spark使用懒惰评估。这些转换本身不会调用任何操作,直到Spark遇到一些被称为*输出转换*的操作,该转换实现了图的实现并导致执行开始。如果你想看看'sortByKey'实际上在做什么,请查看['BlockStoreShuffleReader.read'](https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache /spark/shuffle/BlockStoreShuffleReader.scala#L44)方法 –

+0

@YuvalItzchakov我会注意到'sortByKey'不是完全懒惰。它会热切地处理输入rdd。 – zero323

+0

@ zero323真的吗?我不知道。你能否参考处理输入RDD的代码中的部分?我看到的只是一个分配的ShuffleRDD。 –

回答

0

它涉及到洗牌,但当然这只有在您的执行图中涉及收集或采取行动时才会发生。这是因为当必须从其他转换消耗排序的结果时,使用相同的密钥记录必须定向到群集上的相同使用者。

+0

谢谢。所以只需确认一下,如果我在sortByKey之后不调用collect()并使用map()或foreachPartition()之类的转换,它将不会触发shuffle?那么,为什么在调用sortByKey之后生成混洗RDD? – user401445

0

基本上,sortByKey()是一个宽类型转换。由于所有的转换操作本质上都是懒惰的,只有当你触发一个动作(在你的情况下为collect())时,混洗才会发生。一般而言,转型就像操作说明。 Action将使用这个指令来执行它。您也可以参考DAG获取更清晰的图片。

相关问题