sc.defaultParallelism
は単なるヒントです。構成によっては、ノード数と関係がない場合があります。これは、パーティション カウント引数を受け取る操作を使用するが、それを指定しない場合のパーティションの数です。たとえばsc.parallelize
、リストから新しい RDD を作成します。2 番目の引数を使用して、RDD に作成するパーティションの数を指定できます。ただし、この引数のデフォルト値は ですsc.defaultParallelism
。
Executor の数はsc.getExecutorMemoryStatus
Scala API で取得できますが、これは Python API では公開されていません。
一般に、RDD にはエグゼキューターの約 4 倍のパーティションを用意することをお勧めします。これは良いヒントです。なぜなら、タスクにかかる時間にばらつきがある場合は、これで均等になるからです。たとえば、一部のエグゼキュータは 5 つの高速タスクを処理し、他のエグゼキュータは 3 つの低速タスクを処理します。
これについては、あまり正確である必要はありません。大まかなアイデアがあれば、見積もりで行くことができます。たとえば、CPU が 200 個未満であることがわかっている場合、500 個のパーティションで問題ないと言えます。
したがって、この数のパーティションで RDD を作成してみてください。
rdd = sc.parallelize(data, 500) # If distributing local data.
rdd = sc.textFile('file.csv', 500) # If loading data from a file.
または、RDD の作成を制御しない場合は、計算の前に RDD を再分割します。
rdd = rdd.repartition(500)
を使用して、RDD 内のパーティションの数を確認できますrdd.getNumPartitions()
。