2016-09-28 3 views
0

私は、個々のパーティションをローカルで並べ替える巨大なRDDを持っています。私はsortByKey操作を調べましたが、シャッフルを呼び出すかどうかはわかりません。 (私はシャッフルを避けたい)Cloudera blogSparkのsortByKeyはシャッフルを呼び出しますか?

は、sortByKeyがシャッフルを伴うだろうと述べたが、コレクト()が呼び出されるまで何のシャッフルがないようsortByKeyのjavadocから、それが見えます。さ

質問:sortByKey()にはデータのシャッフルが含まれていますか?はいの場合、各RDDパーティションのデータをソートする最も良い方法は何ですか?いいえの場合、collect()はどのようにしてすべてをグローバルにソートしますか?

+0

スパークは遅延評価を使用します。 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()などの変換を使用しないと、シャッフルがトリガーされません。次に、sortByKeyを呼び出した後にシャッフルされたRDDが生成されるのはなぜですか? – user401445

0

基本的に、sortByKey()はワイド型変換です。すべての変換操作が本質的に怠惰なので、シャッフルはあなたのアクション(あなたのケースではcollect())を引き起こすときにのみ起こります。一般に、変換は操作のための命令のようなものです。アクションは、この命令をその実行に使用します。より鮮明な画像をDAGで参照することもできます。

関連する問題