web-dev-qa-db-ja.com

RDDのパーティション数とパフォーマンスSpark

Pysparkでは、リストからRDDを作成し、パーティションの数を決定できます。

sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)

RDDをパーティション分割することにしたパーティションの数は、パフォーマンスにどのように影響しますか?そして、これはマシンのコア数にどのように依存しますか?

30
mar tin

主な効果は、指定するパーティションが少なすぎるか、またはfarパーティションが多すぎることです。

パーティションが少なすぎるクラスターで使用可能なすべてのコアを使用するわけではありません。

パーティションが多すぎる多数の小さなタスクを管理する際に過剰なオーバーヘッドが発生します。

2つのうち、最初の方がパフォーマンスにはるかに影響を与えます。小さすぎるタスクのスケジューリングは、パーティション数が1000未満の場合、この時点では比較的小さな影響です。数万のパーティションがある場合、sparkはveryを取得します遅い。

45
javadba

Javadbaの優れた答えに追加するために、使用可能なCPUコア間で作業がより均等に分散されるように、クラスター内のCPUコア数の3倍または4倍にパーティション数を設定することをお勧めします。つまり、クラスター内のCPUコアごとに1つのパーティションしかない場合、1つの最長実行タスクが完了するのを待つ必要がありますが、それをさらに分解した場合、夜間および高速実行タスクでワークロードのバランスがより均等になります。

37
Chris Townsend

パーティションの数は、sparkコードのパフォーマンスに大きく影響します。理想的には、sparkパーティションは、シャッフルするデータ量を意味します。通常、このパラメータはシャッフルサイズ(シャッフル読み取り/書き込み)および最大パフォーマンスを得るためにパーティションごとに128〜256 MBのパーティション数を決定できます。

プロパティをspark.sql.shuffle.partitionsとして設定することにより、spark SQLコードでパーティションを設定できます。 df.repartition(numOfPartitions)

0
Amit khandelwal