データ量があらかじめわかっていない(または大きく変化する)スパークジョブを設計する際のベストプラクティスについては、私は疑問に思っています。私の場合、アプリケーションは初期ロードとそれ以降のインクリメンタルデータの両方を処理する必要があります。sparkで大きく変化するデータサイズを扱う方法
私は例えばrepartition
を使用するか、実行者(エグゼキュータごとに割り当てられたメモリの一定量を与える)でOOMのexcpetionを避けるためにspark.sql.shuffle.partitions
のようなパラメータを設定(私のデータでは、パーティションの数を設定する方法を疑問に思う。私ができる
- でも非常に高いワークロードに、仕事が終わっ反復を紹介ソース・データ
- の大きさに応じて、実行時にパーティションの
- セット数を失敗しないことを確認するために、パーティションの非常に高い数を定義データの独立したチャンク(すなわち、ループすべてのオプションで)
、私は問題を参照してください。
1:taksは
2非常に小さな得るように私は、これは、小さなデータサイズのために非効率的であることが想像:追加のquerysニーズ(例えば、 (例えば、count
)。私は
3を避けたいどのrestartetする必要がSparkContext
、spark.sql.shuffle.partitions
を設定する:スパーク
の精神と矛盾するようだだから私は、最も効率的な戦略が強く、様々なデータボリュームにあるのだろうか。
EDIT: 私はspark.sql.shuffle.partitions
の設定について間違っていた、これは、これは必要とされている知らずにパーティションの高い数を設定しないでくださいスパークコンテキスト
あなたの答えに感謝します。しかし、これは実行時に 'spark.sql.shuffle.partitions'を設定する方法の問題を残しています。なぜなら、大きなテーブルに参加するためには、小さなテーブルを結合するよりも高い値が必要です。そうでなければ、メモリが足りなくなります。 AFAIK(シャッフル)結合中に、パーティションの最初の数は関係ありません、または私は間違っていますか? –