3

次のコードでアプリケーションを実行しています。3 つあるのに 1 つのエグゼキュータしか使用されていない理由がわかりません。範囲を広げようとすると、ジョブが失敗し、タスク マネージャがエグゼキュータを失います。要約すると、シャッフル書き込みの値が表示されますが、シャッフル読み取りは 0 です (おそらく、すべてのデータが 1 つのノードにあり、ジョブを完了するためにシャッフル読み取りが発生する必要がないためです)。

val rdd: RDD[(Int, Int)] = sc.parallelize((1 to 10000000).map(k => (k -> 1)).toSeq)
val rdd2= rdd.sortByKeyWithPartition(partitioner = partitioner)
val sorted = rdd2.map((_._1))
val count_sorted = sorted.collect()

編集:エグゼキュータとドライバのメモリとコアを増やしました。また、executor の数を 4 から 1 に変更しました。これが役に立ったようです。各ノードでシャッフルの読み取り/書き込みが表示されるようになりました。

4

2 に答える 2

4

あなたのコードは、RDD 用のパーティションが 1 つだけで終わっているようです。3 つのエグゼキューターすべてを利用するには、RDD のパーティションを少なくとも 3 つに増やす必要があります。

于 2016-09-21T03:40:39.387 に答える
3

..すべてのデータが 1 つのノード上にある可能性があります

これにより、RDD には、最終的にすべてのエグゼキューターを使用する3 つ以上のパーティションではなく、1 つしかないパーティションがあると思われるはずです。

したがって、Hokamの答えを拡張すると、次のようになります。

rdd.getNumPartitions

これが 1 の場合、次のように RDD を再分割します。

rdd = rdd.repartition(3) 

これにより、RDD が 3 つのパーティションに分割されます。

コードをもう一度実行してみてください。

于 2016-09-21T04:16:05.487 に答える