私はプロトタイプ作成中の推奨エンジンのSpark操作のパフォーマンスを向上させるために取り組んでいます。私は使用しているDataFramesとの間に大きなパフォーマンスの違いを見つけました。両方の上の記述()の結果の下に。非常によく似た2つのSpark Dataframesのパフォーマンスの違いの原因
DF1(速い、numPartitions = 4):
+-------+------------------+--------------------+
|summary| item_id| popularity|
+-------+------------------+--------------------+
| count| 187824| 187824|
| mean| 96693.34836868558| 1.0|
| stddev|55558.023793621316|5.281958866780519...|
| min| 0| 0.9999999999999998|
| max| 192806| 1.0|
+-------+------------------+--------------------+
DF2(遅い約10倍、numPartitions =±170):
+-------+-----------------+-----------------+
|summary| item_id| count|
+-------+-----------------+-----------------+
| count| 187824| 187824|
| mean|96693.34836868558|28.70869537439305|
| stddev|55558.02379362146|21.21976457710462|
| min| 0| 1|
| max| 192806| 482|
+-------+-----------------+-----------------+
両方のデータフレームは、点で同じサイズをキャッシュされます列(187824)と列(2)の列であり、同じitem_id
列を持ちます。主な違いは、フレーム1には2番目の列にfloatが含まれ、フレーム2には整数が含まれている点です。
DataFrame 2のすべての操作が、単に.describe().show()
の操作から、さらに詳細な.subtract().subtract().take()
に至るまではるかに遅いようです。後者の場合、DataFrame 2はフレーム1の場合は2秒(約10倍遅くなります)ではなく、18秒かかります。
この違いの原因の説明をどこから始めるべきかわかりません。正しい方向のヒントやナッジがあれば大歓迎です。
UPDATE:Viacheslav Rodionovが提案したように、データフレームのパーティション数がdf2のパフォーマンス問題の原因になっているようです。
さらに深く掘り下げてみると、両方のデータフレームは同じ元のデータフレーム上で.groupBy().agg().sortBy()
操作の結果です。 .groupBy().agg()
の操作では200個のパーティションが生成され、.sortBy()
はそれぞれ4個と170個のパーティションを返します。それは、データがよりよく圧縮することを可能にするとファイルの操作ではなく、より実際の作業を行うためとして
私はdf.rddを見ることから始めます。getNumPartitions() –
パーティション数は174(低速)と4(高速)です。このヒントをありがとう、私はこれについて何かを読んで覚えて、私は状況を理解するために深く掘るでしょう。 Sparkによってパーティションの数が自動的に選択されました。試行錯誤、手作業による唯一の調整方法ですか? – Fulco