スパーク:パフォーマンス・チューニング

リソースパラメータチューニング

      スパークジョブ完成ランニングの基本原則を理解した後、リソースの関連するパラメータは、理解しやすいです。実行性能スパークジョブを強化するように、リソース使用の効率を最適化するために様々なパラメータを調整することにより、主にリソースのプロセススパーク使用の各部の動作のために、実際には、いわゆるリソースパラメータチューニングをスパーク。次のパラメータスパークは、主要なリソースパラメータ、動作原理の仕事の一部に、各パラメータの対応で、我々はまた、チューニング基準値を与えます。

NUM-執行

 パラメータの説明:このパラメータは、総使用量の処理を実行するエグゼキュータスパークジョブの数を設定するために使用されます。ドライバークラスタマネージャの糸にリソースを適用する際、糸クラスタマネージャは、クラスタの各ノード上で動作するようにあなたの設定に従うようにエグゼキュータ・プロセスの適切な数を開始しようとします。このパラメータは設定されていない場合、デフォルトでは唯一、あなたのスパークジョブで実行速度が非常に遅いです、プロセスを開始するあなたのエグゼキュータの少量を与える、非常に重要です。

  パラメータチューニングの推奨事項:スパークジョブは、一般に、約50から100のエグゼキュータ・プロセスの各セットを実行するために少なすぎるか、あまりにも多くのキュータ設定処理が良くない、適切です。あまりにもいくつかの設定は、クラスタリソースをフルに活用することができません。あまりにも多くの設定、キューのほとんどは十分な資源与えられないかもしれません。

エグゼキュータ・メモリ

        パラメータの説明:このパラメータは、各エグゼキュータ・プロセスのメモリを設定するために使用されます。エグゼキュータのメモリサイズは、多くの場合、直接パフォーマンススパークジョブを決定しますが、一般的なJVM OOMの例外を除いて、直接的な相関関係があります。

  パラメータチューニングの推奨事項:エグゼキュータは、各メモリ4G〜8Gプロセスのために提供、より適切です。しかし、これはあくまでも参考値であり、特定の設定は、まだリソース・キューの異なる部門に応じて決定しなければなりません。最大メモリの制限は、自分のチームを見ることができ、NUM-執行がエグゼキュータ・メモリにより、リソースキューの数倍され、それは(、すべてのエグゼキュータのメモリプロセスの合計です)スパークジョブに、アプリケーションメモリの総量を表し、量これは、メモリのキューの最大量を超えることはできません。あなたはチームの他の人と、このリソースのキューを共有している場合また、そのアプリケーションは、独自のスパークジョブを避けるために、最大総メモリリソースキュー1/3〜1/2を超えてはならないメモリの総量は、キューのすべてを占めます他の学生の仕事につながるのリソースは、実行することはできません。

パフォーマー、色

 パラメータの説明:このパラメータは、各執行プロセスのCPUコアの数を設定するために使用されています。このパラメータは、各エグゼキュータ・プロセスの並列実行タスク・スレッドの能力を決定します。各CPUコアのみを同時にスレッドに1つのタスク、エグゼキュータ・プロセスごとのCPUコアのように多くの数を行うことができるため、より迅速にすべてのタスクスレッドを完了するために割り当てられ行います。

  パラメータチューニング勧告:executorが2~4に設定されているCPUコアの数がより適切です。セットにさまざまな部門を持っている同じリソースキューによると、あなたは、最大CPUコアの制限独自のリソースを参照することができ、各エグゼキュータ・プロセスは、複数のCPUコアに割り当てることができるかを決定するためにエグゼキュータ・セットの数に基づいて、その後のキュー、および数です。また、キューが他の人と共有されている場合は、NUM-執行が*エグゼキュータ・コアは、全コホートのCPUコアが適切で1/2〜1/3程度で超えてはなりませんが、他の生徒を実行するために、仕事への影響を回避することが示唆されました。

ドライバ、メモリ

パラメータ説明:このパラメータは、メモリドライバのプロセスを設定するために使用されます。

  パラメータチューニングの推奨事項:ドライバのメモリは、通常設定されていない、または1G程度のセットは十分なはずです。ノートへの唯一のものはそうでないOOMメモリオーバーフローの問題があるでしょう、あなたはRDDの演算子を使用する必要がある場合は、処理のためのプル・ドライバに全てのデータを収集し、それはドライバーのメモリが十分な大きさであることを確認しなければならないということです。

spark.default.parallelism

 パラメータの説明:このパラメータは、タスクの各段階のためのデフォルトの数を設定するために使用されます。このパラメータは、直接あなたの仕事のパフォーマンススパークに影響を与える可能性が設定されていない場合は、非常に重要です。

  パラメータチューニングの推奨事項:スパークジョブのデフォルトのタスク番号500〜1000、より適切です。多くの学生は、多くの場合、時間がデフォルトのタスクにHDFSブロックの対応で、HDFSのブロック下の数に基づいて、タスクの数を設定するために自分自身をスパークにつながるだろう、間違いは、このパラメータを設定しないことを確認してください。タスクの数が少なすぎる場合には一般的に言って、スパークデフォルト設定の数が少ない通常よりもある(例えば、タスクの数十に)、それはエグゼキュータがすべて水の泡に来て良いのパラメータを設定するためにあなたの前になるでしょう。想像して、ノーどのように多く、どのくらいのメモリとCPUあなたのエグゼキュータ・プロセスを重要ではなく、1つのタスクのみまたは10、その後、エグゼキュータ・プロセスの90%は、単にリソースの無駄であるタスクを実行しない場合があります!推奨設定の原則の公式ウェブサイトスパークNUM-のエグゼキュータのパラメータを設定することです* 2〜3回エグゼキュータ・コアしたがって、このようなCPUコアキュータの総数など、より適切には、その後、1000年タスクは、この時点で、可能であるセット、300ですあなたは、リソースのスパーククラスタをフルに活用することができます。

spark.storage.memoryFraction

パラメータの説明:このパラメータは、データメモリに使用されているがエグゼキュータ比例RDDの永続性のデフォルトは0.6で、提供することができます。換言すれば、メモリのデフォルトキュータ60%が、永続的なデータRDDを格納するために使用することができます。あなたが選択した永続化戦略によっては、そうでない場合、十分なメモリ、データはおそらく持続しない場合、またはデータがディスクに書き込まれます。

  チューニングパラメータは、推奨:Sparkの操作、より永続的なRDD動作がある場合、パラメータ番号の値が適切にデータの永続性メモリに収容することができることを確認するために改善することができます。データが得られ、すべてのデータをキャッシュするのに十分なメモリがないだけで、パフォーマンスを減らし、ディスクに書き込むことができないようにしてください。より多くのスパークジョブクラスシャッフル処理、および長期的な操作が比較的小さい場合には、その後、パラメータの値は、より適切なのいくつかを軽減することが適当。あなたは(それが火花ウェブUIのGCの仕事に時間のかかるを通して観察することができます)頻繁なGC原因遅さに仕事を見つけた場合に加えて、平均タスク実行するユーザコードメモリは十分ではありません、それはまた、このパラメータの値を小さくすることをお勧めします。

spark.shuffle.memoryFraction

 パラメータの説明:最終段の出力にプロセスシャッフルプルタスク後のタスクは、重合はデフォルトを設定するための操作を行う場合、このパラメータメモリキュータ比を用いることができるが0.2です。換言すれば、エグゼキュータは、メモリの20%のみが、この動作のために使用されるデフォルト。重合シャッフル操作が行われると、メモリを使用して、それが20%のこの限界を超えて検出された場合、過剰な意志オーバーフローデータをディスク・ファイルに書き込まれ、その後、パフォーマンスが大幅に削減されるであろう。

  パラメータチューニングの推奨事項:スパークジョブ少ないオペレーション、より多くのシャッフル操作持続性、永続的なメモリ操作の割合を減らす割合がシャッフル回避過度のデータメモリの間に、シャッフルメモリ操作を占めて増加することをお勧めしますRDD場合は十分ではありませんオーバーフローがパフォーマンスを減らし、ディスクに書き込む必要があります。タスク実行するユーザコードメモリが十分でないことによる頻繁なGCの原因遅手段に仕事を見つけた場合に加えて、また、このパラメータの値を小さくすることをお勧めします。
本発明を参照しながらチューニングリソースパラメータではなく、固定された値は、(操作の数RDD持続シャッフル動作スパークジョブの数、および火花のWeb UIを示すジョブGCを含む)は、それらの実際の条件に応じて、学生が必要記事、合理的なセットこれらのパラメータに与えられた原則とチューニングアドバイス。

リソースパラメータリファレンス例

      以下は、スパーク-submitコマンドの一例であり、我々はを参照してください、そして彼らの実際の状況に応じて調整を行うことができます。

./bin/spark- \提出
   --master yarn- クラスタ\
   --num・エグゼキュータ100 \
   --executor- メモリ6G \
   --executor-コア4 \
   --driver- メモリ1G \
   --conf火花。デフォルト .parallelism = 1000年\
   --conf spark.storage.memoryFraction = 0.5 \
   --conf spark.shuffle.memoryFraction = 0.3 \

不合理なパラメータ設定

私たちは、炉心パラメータを見て前に、この技術は、比較的一般的です。

NUM-執行= 10 || 20、エグゼキュータ-コア= 1 || 2、エグゼキュータ・メモリ= 10 || 20、ドライバメモリ= 20、spark.default.parallelism = 64

次のように私たちの火花キューリソースを仮定:

メモリ= 1T、コア= 400

どのようにここで設定したパラメータには、まずあなたが資源配分と利用スパークの原理を理解する必要があり、いくつかのヒントがあります:

デフォルトでは、非動的なリソース割り当てのシナリオは、事前にアプリケーションリソースをスパーク、タスクは、タスクを実行しなかった、あなたの踏み石が終了していないスパーク殻を果たしたなど、すべての上に、ジョブ全体のタスクまで、リソースを独占起動しませんそれは、常にすべてのリソースアプリケーションを占有します。(あなたがNUM-執行を設定した場合、動的なリソース割り当ては失敗します)

あなたは問題がパラメータ設定上の他の問題につながる理解していない場合のMapReduce /ハイブ文、スパークリソースの割り当てと使用上のは、非常に異なることに注意してください。

例えば、エグゼキュータ・コアは、適切な数を設定しますか?以下ミッション並列処理は、より多くの排他的資源がコホート全体のうち実行され、他の学生は、上記のような、そのタスクをタスクを実行することはできません、NUM-執行= 20エグゼキュータ・コア=ケース1エグゼキュータ・メモリ= 10に20個のコアを独占し、200Gメモリは、三時間続きました。

タスクは、当社の既存のリソースと組み合わせて、どのように5つのコアのパラメータを設定するには、この場合でのために?

1)小さすぎたり大きすぎない* num_executorsをexecutor_cores!ログが非常に小さい場合を除き、一般的に、そのような最大以上100、最小値は40未満には推奨されないキュー総コア400、として総コホートコア、25%を超えません。

2)ない1 executor_cores!そうでない場合は、ワークプロセス内のスレッドの数は、通常2〜4が適切である、小さすぎます。

3)executor_memory一般的な6〜10グラム、それ以外の場合にはコストがかかりすぎるGC、またはリソースの深刻な浪費につながる、最大ではない以上20G以下、適切です。

4)spark_parallelism通常1〜4倍executor_cores * num_executors、システムのデフォルトの64、それは彼らがバッチで連続的に実行されたときに、タスクの多くにつながる、またはアイドル状態のコアの数が多い、リソースの深刻な浪費になる設定しないでください。

5)ドライバ - メモリ以前の学生は、すべてのドライバのコンピューティングおよびストレージせず、実際には、20Gを設定していますが、スパーク・シェル、または一般的に1〜2グラム十分にある場合を除き、糸でタスクのリソース管理およびタスクの相互作用を発行しました。

メモリマネージャをスパーク:

またExecutionMemoryとしても知られている6)spark.shuffle.memoryFraction(デフォルト0.2)。必要なバッファ頻繁にIOを避けるためにシャッフル、結合、ソートや集計プロセスを解決するために、このメモリ領域。アプリケーションは、このような操作の数が多い場合には増加することが適切です。

またStorageMemoryとしても知られている7)spark.storage.memoryFraction(デフォルト0.6)。(つまり、あなたがコールdd.cache、rdd.persistや他の方法を示した)、そこに放送され、タスクの結果が格納されたブロックのキャッシュを解決するために、このメモリ領域。あなたが永続性操作や放送変数の多くを呼び出す場合のパラメータによって、それを増加することが適切です。

プログラム自体もメモリを実行する必要性、(デフォルトは0.2)であるので、8)他のメモリ、システムに予約。1.6における他のメモリが利用可能少なくとも300メートルであることを確実にするために調整されています。またspark.testing.reservedMemory手動で設定することができます。そして、実際に使用可能なメモリマイナスreservedMemory GET usableMemoryを。ExecutionMemoryとStorageMemoryシェアusableMemory *メモリの0.75。0.75 spark.memory.fractionは新しいパラメータによって提供されています。現在spark.memory.storageFractionデフォルト値は0.5であり、そうExecutionMemory、StorageMemoryデフォルトは、利用可能なメモリが上記共有されています。

あなたが大規模な辞書ファイルをロードする必要がある場合は、GCを減らすためにスワップアウトグローバル辞書を避けることができるので、たとえば、あなたは、StorageMemoryサイズにexecutorを増やすことができ、この場合には、我々は効率の実現と引き換えにメモリリソースと同等のものを使用します。

おすすめ

転載: www.cnblogs.com/tesla-turing/p/11959428.html