スパーク傾きデータ・ソリューション

スパーク傾きデータ・ソリューション

解決策1:ハイブETLを使用して前処理データ

プログラムのアプリケーションのシナリオ:

ハイブ原因データテーブルが傾いています。データハイブテーブル自体は、(例えば、1万台に対応するキーデータ、10に対応する唯一の他のキーデータのような)不均一であり、両者は、しばしば使用されるビジネスシナリオスパークある場合、ハイブテーブルにコンパレータを解析操作を実行しますこのようなソリューションに適しています。

アイデアのプログラムの実現:

この時点でデータ(キーハイブETL重合、又は事前に他の表に従ってデータを介して、すなわち、予め、及び参加)ハイブによって前処理することができるかどうかを評価することができ、その後、ジョブのデータ・ソースは、元のスパークありませんテーブルのハイブが、前処理ハイブテーブルの後。この時点で、データは、以前に重合させ、または結合操作されているため、元のクラススパークシャッフル操作を使用する必要がなく、これらの操作オペレータを行います。

プログラムの実装の原則:

完全にスパーククラスオペレータで実行shuffleを避けるため、このプログラムアドレスデータスキューの根本原因は、その後、確実にデータなしスキュー問題が存在することになります。しかし、ここで我々はまた、この方法は、緩和的に属していることを皆に思い出させる必要があります。すべてのデータ自体の後、それはハイブETLが参加したり他のグループシャッフル処理によりときに実行され、データはまだ非常に遅いハイブETLその結果、傾斜う不均一な分布の問題があります。直前のデータスキューの我々はハイブETL、データの発生は、それを避けるために、スキュースパークプログラムに発生します。

プログラムの利点:

簡単で便利な実装、効果は完全にデータの偏りを回避し、スパークジョブのパフォーマンスが大幅に改善され、また非常に良いです。

プログラムの欠点:

一時的な解決策は、データスキューハイブETLはまだ発生します。

プログラムの経験:

一部のJavaシステムスパークプロジェクトの使用に関連して、Javaコードが頻繁にスパーク・ジョブ・シーンと呼ばれる表示されますが、スパークジョブの実行性能が要求され、それがこのプログラムの使用に適しています。ハイブETLの上流に事前に傾きデータは、各呼び出しのJavaスパークジョブの実行速度はすぐに、より良いユーザーエクスペリエンスを提供することができるようになります後にしながら、時間は、比較的低速であることだけを、一日一回のみ実行しました。

プロジェクトの経験:

米国のグループ・コメントインタラクティブなユーザーの行動分析にこの方式で使用されるシステムでは、システムは、ユーザーがJavaのWebシステム、Javaは統計解析スパークジョブデータが提出したバックエンドを経由して、統計データ分析タスクを提出できるようにするために主にあります。スパークはスピードがそうでない遅すぎる、ユーザーエクスペリエンスが悪くなる、10分以内に可能な限り、高速である必要があります動作させる必要がありました。我々はハイブETLに進みますいくつかのスパークジョブアクションをシャッフルして、テーブルの前ハイブの真ん中を直接使用することができスパークは、シャッフル操作スパークが大幅にパフォーマンスを向上させる、可能な限り削減、一部の操作のパフォーマンスが6を改善しました回以上。

対処方法2:いくつかのキーの傾きのフィルタ結果

プログラムのアプリケーションのシナリオ:

それはいくつかの重要な傾きになり、計算自体への影響が大きくないあなた見つけた場合、このプログラムを使用するのに適しています。例えば、99のデータに対応するキーの10%が、百万のデータに対応する唯一のキーは、スキューデータが得られます。

アイデアのプログラムの実現:

我々は、データキーの特に大量の一握りは、実行の仕事と結果は特に重要ではないと判断した場合は、単にいくつかのキーをフィルタリングするためにそれを指示。例えば句は、キーまたはRDDのスパークコアにおける主要オペレーターフィルタリングするフィルタを行うフィルタリングするために使用され得る、スパークSQL。ジョブの実行ごとに必要に応じて、動的にキーを決定し、フィルタ処理されたデータの量は、その後、オペレータは、サンプルにRDDサンプルに使用されてもよいし、各キーの数、キー濾過されたデータの最大量を計算しますことができます。

プログラムの実装の原則:

キーの傾きが計算に参加しないだろうこれらのキーからフィルタにデータが発生した後、自然な傾斜がデータを生成することは不可能です。

プログラムの利点:

シンプルなだけでなく、非常に効果的な、それは完全にデータがスキュー回避することができます。

プログラムの欠点:

該当シーンはずっと、ほとんどの場合、キーを傾けるようにつながるだけでなく、いくつか、まだ多くのです。

プログラムの経験:

このプロジェクトでは、データの偏りにこのソリューションを使用していました。一度突然OOMを実行するジョブをスパークするとき1日に発見、およびトレース後に発見された、ハイブの表は、データ量の急増で、その結果、データの日に一つのキーは例外です。このように、いくつかのサンプルキーのデータの最大量のすべての計算の前に取るべき最初のサンプリング後、そのキーはプログラムで直接フィルタリングします。

解決策3:並列処理のシャッフル操作の度

プログラムのアプリケーションのシナリオ:

私たちは、データスキューのイラクサを把握する必要がある場合、それは、治療計画データスキューの最も単純な種類があるので、このプログラムの優先度を使用することをお勧めします。

アイデアのプログラムの実現:

RDDは、例えばreduceByKey(1000)のようなシャッフルカウント中性子、パラメータを渡すシャッフルオペレータに対して実行されるシャッフルオペレータの数がシャッフル読み出しタスクを実行するとき、このパラメータが設定されています。などの参加によるグループ、パラメータを設定する必要があり、すなわちspark.sql.shuffle.partitionsとしてシャッフルクラス、スパークSQLステートメントの場合、パラメータは、多くのシーンのデフォルト値200で並列シ​​ャッフル度読んでタスクを表し、それは少し小さすぎます。

プログラムの実装の原則:

シャッフル読み出しタスクの数を増やすと、各タスクが少なく、元のデータより加工ように、複数のタスクに割り当てられたタスクの元のように複数のキーに割り当てることができます。タスクの5つのキーに割り当てられているデータを、5つのオリジナルの鍵、各鍵10の対応がある場合、例えば、タスクは、データ50を処理します。シャッフルタスクを読んだ後増加し、各タスクはキーに割り当てることができ、すなわち、データの各処理タスク10は、各タスクの実行時間の性質は短くなります。図に示すように、原理詳細。

プログラムの利点:

実現するのが比較的簡単で、効果的に軽減し、データスキューの影響を軽減することができます。

プログラムの欠点:

ただ、完全に実際の経験に基づいて、問題を根絶ない、データを容易にするために、それを傾け、効果が限定されています。

プログラムの経験:

プログラムは、完全なデータの量など、いくつかの極端な状況は、キー、その後いくらタスクの数を増やし、万人に相当する場合ので、データがキーデータの1,000,000がまだ割り当てられなければならないし、この対応を歪曲解決しない通常でありますタスク処理に行くので、スキューが起こるか、データ運命に。したがって、この方式は口にしようとしたときに最初のデータスキュー、使用する手段を見つけようとしてデータを容易にするための最も簡単な方法は、それをスキュー、または他のプログラムと組み合わせて使用​​することを言うことができます。

解決策4:2段重合(グローバル+ローカル重合重合)

プログラムのアプリケーションのシナリオ:

この方式でスパークSQLパケット凝集RDDまたはステートメントを使用して、グループに基づいてシャッフルオペレータのような重合reduceByKeyを行う場合に適しています。

アイデアのプログラムの実現:

このプログラムの核となるアイデアは、二段重合を達成することです。第など、元のキーが異なると同じになり、この時点で、10未満、ランダム番号として乱数でマークされている各キーを与える、部分重合は(こんにちは、1)(こんにちは、1) (こんにちは、1)(こんにちは、1)、(1_hello、1)(1_hello、1)(2_hello、1)(2_hello、1)となるであろう。次いで、乱数を用いてマークされたデータ、及び他の重合実験はreduceByKey、部分重合、部分重合結果を行うには(1_hello、2)(2_hello、2)となるであろう。次に、各キーにプレフィックスを削除し、再びグローバル、(こんにちは、2)(ハロー、2)重合時になり、最終的な結果は、例えば(こんにちは、4)のために、得ることができます。

プログラムの実装の原則:

元のデータ処理タスクは、重合を行うために、ローカルタスク複数の分散されたこと、および単一タスク処理へのデータの過剰量を解決することができるように、異なる鍵の複数に、ランダムな方法を追加して同じキーオリジナル接頭問題。その後、ランダムプレフィックスが再び世界的に、重合を削除し、最終的な結果を得ることができます。具体的な原則は以下の通り。

プログラムの利点:

効果の傾きのデータシャッフル操作系重合結果を得るために非常に良いです。あなたは通常、データスキューを取り除く、または少なくとも大幅にデータスキュー、数回にわたるスパークジョブの性能向上を容易にすることができます。

プログラムの欠点:

クラスは、重合シャッフル操作、比較的狭い範囲にのみ適しています。シャッフル操作がクラスに参加した場合、我々は他のソリューションを使用する必要がありました。

解決策5:参加マップに参加削減します

プログラムのアプリケーションのシナリオ:

RDDに基づく操作に参加、または使用を使用する場合、本実施形態に適し、スパークSQLで文を結合し、RDDテーブルまたは(例えば1200少数GまたはMのような)データの比較的少量の結合操作。

アイデアのプログラムの実現:

演算子を使用せずに操作をつなぐ参加、変数が結合操作を実現するために放送事業者のクラスマップを使用し、したがって完全に回避シャッフル操作クラスは、完全に傾きの発生を回避し、データが表示されます。直接その変数をドライバにメモリの終わりに採取し、ブロードキャストを作成するために、オペレータによって引っ張ら小さいデータRDD; RDD次に、別のオペレータが行うが、マップベース、オペレータ関数で、変数ブロードキャストからデータの少ないRDD全額、接続は、そのデータはあなたが接続する必要がある方法で2つのRDDになる場合接続キー、同じキーに合わせて整列させた現在のRDDとの各データを取得します。

プログラムの実装の原則:

共通するのは、同じキーに相当shuffleは、タスクは、その後に参加読んシャッフルにデータを引き出し、そしてその時に参加削減すると、シャッフルプロセスを行く参加します。RDDが比較的小さい場合は、あなたが参加する、すなわち、地図の参加、シャッフル操作は、この時点で発生していないと、データが傾いて発生しません同じ効果を達成するために、小さなRDD +マップ演算子をデータ放送の全額を使用することができます。図に示すように、原理詳細。

プログラムの利点:

演算結果を参加傾きデータは、効果が発生してシャッフルしないので、それはデータのスキューを実現しなかった、非常に良いです。

プログラムの欠点:

少ない適用シナリオ、プログラムは、大きなテーブルと小さなテーブルに適用されるため。すべての後、私たちは小さなテーブルの放送が必要になります、この時間は、比較的、メモリリソースを消費し、ドライバメモリエグゼキュータと各居住者は、小さなRDDデータの全額となりますされます。我々はRDDデータを放送場合例えば10G以上のように、比較的大きい、メモリのオーバーフローが発生する可能性があります。双方は、したがって、大きなテーブルの場合には適していません。

解決策6:サンプリングチルトとスピンがキー操作に参加

プログラムのアプリケーションのシナリオ:

2 RDD /ハイブテーブルが参加すると、比較的大量のデータではなく、「ソリューションファイブ」、そして時には、2つの重要なRDD /ハイブテーブルの分布を見ることができます。データスキューが発生した場合、それはいくつかの重要なRDD /ハイブテーブルデータが大きすぎるの一つであり、他のすべてのキーRDD /ハイブテーブルであるため、より均一に分布され、次いで、この溶液の使用がより適切ですA。

アイデアのプログラムの実現:

図1は、RDDのキーサンプルにサンプルオペレータをサンプリングすることにより、大量のデータの一握りを含み、各キーの数に関する統計情報、およびいくつかのキーの最大データ量を算出しました。
  図2は、元のRDDうちから、これらのいくつかの主要な分割に対応するデータが、単一RDDを形成するために、各キーに最も傾斜キーを発生させることなく、より少ないプレフィックスとしてnよりも乱数でマークされていますさらにRDDを形成します。
  3、他のRDDだけでなく、いくつかの単一のフォームとRDDに対応する鍵データを濾別傾斜し、データがデータのn個の各々に展開され、データのn個が順次取り付けられる〜0に参加するその後の必要性接頭辞nは、ほとんどのキーは、別の傾いRDD形成されてなりません。
  4は、独立したRDDのために、追加のランダムプレフィックスが別の独立したRDDでN倍に拡大参加、元の場合は、参加行うためのタスクの複数に分散され、同一のNキーの部分に分けることができます。
  図5は、他の2つの一般的なRDDは、いつものように参加することができますが。
  6、最後の二つは、UNION演算子を使用して結果を参加することが参加の最終結果で、マージすることができます。

プログラムの実装の原則:

傾斜から生じるデータを結合傾きにのみいくつかの重要なリードは、いくつかのキーが別RDDに分割し、追加のランダムな接頭辞とすることができる場合、に分割されるn個の部分は、この時間は、いくつかのキーに対応する、参加データは、いくつかのタスクに集中しますが、複数の間でタスクが行われ参加されることはありません。具体的な原則は以下の通り。

プログラムの利点:

データが発生するスキューを傾斜にのみいくつかの重要なリードは、このように参加のための鍵を壊すために最も効果的な方法であることができれば、参加します。そして唯一の拡張を必要としないデータの総量に相当するいくつかの傾斜拡張キーデータのn倍にする必要があります。あまりにも多くのメモリを消費しないようにします。

プログラムの欠点:

そのような数十の鍵データの何千ものなどの単語、特に多数の重要な結果の傾きが傾きにつながっている場合は、ので、この方法は適していません。

解決策7:ランダムプレフィックスと拡張RDD参加します

プログラムのアプリケーションのシナリオ:

スキューキーデータの数が多いため、操作、RDDのリードに参加する時に、そのスピンオフキーは意味を持たない場合は、唯一の問題を解決するために、最後のソリューションを使用することができます。

アイデアのプログラムの実現:

例えば10,000以上の複数のキー対応として、得られたデータスキューRDD /ハイブテーブルを見つけ、プログラムと同様に、「溶液6」、最初のビューのデータ分布RDD /ハイブテーブルの基本的な考え方を達成するために1データの断片。
  図2に示すように、各データRDDは、n内のランダムな接頭辞が付いています。
  図3に示すように、拡張のための他の通常のRDDは、データのN個に各データの拡張は、拡張のうちデータの各々を順次プレフィックス〜0 Nでマークされています。
  4、そして最後に2 RDDは、処理に参加することができます。

プログラムの実装の原則:

もともと同じキーが接頭辞を追加することにより、異なるランダム鍵となり、その後、あなたが行くために複数の処理タスク間でこれらのプロセスの後に「異なるキー」することができ、むしろタスクよりも、同じキーを大量に扱います。スキームは、処理能力がRDDを必要としているので、「溶液6つの」違い、一つの解決策は、だけ傾斜特別な処理に対応するキーデータの数が少ない上に可能であるということである拡張メモリRDD後の溶液そう占有率は大きくない、キーの多数に対して傾斜している解決策は、キー部分は、別のプロセス、これだけ全体のデータRDD拡張、厳しいメモリリソースを分割することができません。

プログラムの利点:

データ型への参加を傾け、実質的に処理することができ、その効果は比較的大きな、非常に良好なパフォーマンスです。

プログラムの欠点:

プログラムは完全にスキューデータを回避するのではなく、より多くのデータを容易にするために傾斜しています。全体RDDの拡大の必要性は、メモリリソースが厳しいです。

プログラムの経験:

データのニーズを開発している、彼らはスキューデータを結合するためにリードを発見しました。前の最適化に、ジョブの実行時間は約60分です。このプログラムを使用して最適化され、その後、実行時間は約10分、パフォーマンスの6倍の増加に短縮されます。

解決策8:プログラムの様々な組み合わせ

私は、基本的に解決することができる上述した実施形態のいずれかを使用し、多くの場合、ことが実際に見出され、場合のみ、比較的簡単な処理データスキューシナリオ。より複雑なデータスキューシナリオを処理する場合は、プログラムの種々の組み合わせを使用することが望ましい場合があります。例えば、我々はスパークジョブチルト複数のデータリンクの出現に焦点を当て、あなたはIとII、データ前処理およびデータのいくつかを軽減するためにフィルタリングの一部のソリューションを使用することができます。第二には、その最適化、特定のシャッフル操作の並列度を高めることができますパフォーマンス;最後に、異なるポリマーまたはその性能を最適化するソリューションを選択する操作に参加します。その後、我々は十分に理解して、実際には、異なるさまざまな状況に応じて、様々なプログラムの柔軟な使用は、独自のデータスキューの問題を解決するために、これらのプログラムのアイデアや原則にする必要があります。

リリース元の4件の記事 ウォンの賞賛0 ビュー515

おすすめ

転載: blog.csdn.net/The_Inertia/article/details/104055932