2016-12-06 3 views
1

sparkがどのようにしてパーティションをエグゼキュータに割り当てるか。スパークでエクセキュータ上でパーティションを配布するとき

Iは1つのドライバおよび5つのエグゼキュータとスパークシェルの次の行を実行した:

> var data = sc.textFile("file") // auto generates 2 partitions 
> data.count()     // materialize partitions on two nodes 
> data = data.repartition(10) // repartition data.count()    
> data.count()     // 10 partitions still on original 2 nodes 

再分割した後、10のパーティションは依然として元の2つのノード(5点満点)です。ノード間で均等に分散するのではなく、パーティションを含むノードのそれぞれで5つのタスクが繰り返し実行されるため、これは非常に非効率的です。非効率性は、同じrddで何度も繰り返す反復タスクで最も顕著です。

私の質問は、どのノードがどのパーティションを持っているかをどのように決定するのですか?データを他のノードに移動させる方法がありますか?

+0

あなたは2つのノードについて話しますが、あなたは1つのExecutorを持っていますが、これはあまり意味がありません。彼は私たちについて話していますか? –

+0

申し訳ありませんが、これは編集されたばかりのタイプミスです。 – Yituo

+0

Sparksタスクの配布に問題がありますか?それとも一般的な質問ですか?エグゼクティブはいくつのコアを持っていますか? –

答えて

0

論理を表示するためにここに推測するだけです(必ずしも実際に起こっているとは限りません)。

ファイルが実際に大きくないと仮定します。つまり、HDFSの1ブロック内に収まります。ブロックが2つのノードに複製されると仮定します。 3番目のノードで処理したい場合は、それをコピーする必要があります。カウントは比較的高速な計算であるため、タスクの処理に要する時間は比較的短いことがあります。 Sparkは、データを他のノードにシャッフルするのではなく、ローカルで処理するのを待つことをお勧めします(このパラメーターを構成できます)。

+1

シャッフルするようにどうすれば設定できますか?私は反復的な反復作業をしたいので、シャッフルが必要です – Yituo

関連する問題