2017-06-28 4 views
0

データ量があらかじめわかっていない(または大きく変化する)スパークジョブを設計する際のベストプラクティスについては、私は疑問に思っています。私の場合、アプリケーションは初期ロードとそれ以降のインクリメンタルデータの両方を処理する必要があります。sparkで大きく変化するデータサイズを扱う方法

私は例えばrepartitionを使用するか、実行者(エグゼキュータごとに割り当てられたメモリの一定量を与える)でOOMのexcpetionを避けるためにspark.sql.shuffle.partitionsのようなパラメータを設定(私のデータでは、パーティションの数を設定する方法を疑問に思う。私ができる

  1. でも非常に高いワークロードに、仕事が終わっ反復を紹介ソース・データ
  2. の大きさに応じて、実行時にパーティションの
  3. セット数を失敗しないことを確認するために、パーティションの非常に高い数を定義データの独立したチャンク(すなわち、ループすべてのオプションで)

、私は問題を参照してください。

1:taksは

2非常に小さな得るように私は、これは、小さなデータサイズのために非効率的であることが想像:追加のquerysニーズ(例えば、 (例えば、count)。私は

3を避けたいどのrestartetする必要がSparkContextspark.sql.shuffle.partitionsを設定する:スパーク

の精神と矛盾するようだだから私は、最も効率的な戦略が強く、様々なデータボリュームにあるのだろうか。

EDIT: 私はspark.sql.shuffle.partitionsの設定について間違っていた、これは、これは必要とされている知らずにパーティションの高い数を設定しないでくださいスパークコンテキスト

答えて

0
  1. を再起動woutout実行時に設定することができます。あなたはあなたの仕事のパフォーマンスを絶対に殺します。
  2. はい
  3. あなたが言ったように、ループしないでください!

あなたが言及したように、あなたのデータを数えるための余分なステップを紹介します。一見したところでは間違っています。しかし、これを誤った計算として考えるべきではありません。通常、データをカウントするのに要する時間は、データをひどく分割すると、それ以上処理するのに要する時間よりも大幅に短くなります。カウント操作を投資と考えると、それは確かに価値があります。

設定でパーティションを設定してSparkを再起動する必要はありません。ターゲットを計算し、平均行サイズの見積もりに基づいてデータ

  • のエントリ/行のRDD/DATAFRAME/Datasetのパーティション
  • カウント数の

    1. 注現在の数:代わりに、次の手順を実行します#targetPartitions >> #actualPartitionsが続い
    2. エルス#tarを再分割した場合、パーティションの数は
    3. #targetPartitions < < #actualPartitionsはその後エルス
    4. を合体した場合getPartitions = = #actualPartitionsその後は何もしない

    合体操作は、シャッフルせずにデータを再パーティション化するため、使用可能なときにはるかに効率的です。

    理想的には、カウントするのではなく、生成する行の数を見積もることができます。また、この操作を実行するのが適切な時期について慎重に考える必要があります。スケーラビリティの低い実行のために、複雑なコードを実行する可能性のあるコアの数を誤って減らす可能性があるため、長いRDD系列ではパフォーマンスを低下させる可能性があります。この問題を軽減するには、チェックポイントを調べます。

  • +0

    あなたの答えに感謝します。しかし、これは実行時に 'spark.sql.shuffle.partitions'を設定する方法の問題を残しています。なぜなら、大きなテーブルに参加するためには、小さなテーブルを結合するよりも高い値が必要です。そうでなければ、メモリが足りなくなります。 AFAIK(シャッフル)結合中に、パーティションの最初の数は関係ありません、または私は間違っていますか? –

    関連する問題