Hive、Tez、Yarnリソースの問題の概要と最適化パラメーター
Hive Tez Yarn Resource Problem Summary
- 問題が解決しました
Hadoopバージョン:2.7.3
Hiveバージョン:2.1.1
高速バージョン:0.9.1
問題の説明:HiveがTezを統合した後、次のhive-site.xmlの構成スクリーンショットに示すように、構成によって選択されるデフォルトの実行エンジンはtezです。
サーバー上で直接hiveコマンドを実行すると、通常どおりhiveクライアントに入ることができます。
sethive.execution.engineを実行します
set hive.execution.engine = mrが実行エンジンとしてmrを使用する場合、count(1)などの一部の集計および統計SQLは、次のエラーを直接報告します。 DEFAULT_MR_AM_ADMIN_USER_ENV 。
。
一見すると、この種のあいまいなエラーは非常に気が遠くなるようなものであり、後の情報はjarパッケージの競合です。
解決:
https://blog.csdn.net/cuichunchi/article/details/108611831
スパーク問題解決を含みます。
- 次の異常が発生します。
使用可能なコンテナコンテナが割り当てられていないことを示します。コンテナリソースがプリエンプトされるか、リソースが不十分なため、タスクの再試行の失敗の最大数はデフォルトで4です。したがって、次のパラメータを調整する必要があります。
パラメータ:setで設定 | 値 | 説明 |
tez.am.task.max.failed.attempts | 10 | タスクの再試行回数 |
tez.am.max.app.attemps | 5 | AM自身の障害に対する再試行の最大数。デフォルトは2回です。システム上の理由により、接続が失われる場合があります。 |
hive.tez.container.size | よりは少なくない 糸.scheduler.minimum-allocation-mbまたは等しい 糸の倍数.scheduler.maximum-allocation-mb | Tez AppMasterがRMに適用するコンテナサイズ(M) |
注:hive.tez.container.sizeも大きすぎることはできません。設定が大きすぎると、次のエラーが直接発生します。
- 次の異常なエラーメッセージが表示されます。
mapred-sit.xmlファイルで構成されたmapreduce.task.io.sort.mb = 307はリングバッファーのサイズを示しているため、
上の図では、tez.java.optsは128Mに設定されていますが、これは明らかに307Mよりも小さくなっています。エラーメッセージからわかるように、hive.tez.java.optsを307 /0.8にリセットします。
- 詳細な最適化パラメータ
バックグラウンド
テズは、ハイブの一般的に使用されるエンジンの1つです。この記事では、tezで一般的に使用されるデバッグパラメータを紹介します。主にメモリとマップ/リデュース量の観点からデバッグします。
1.メモリデバッグ
tez.am.resource.memory.mb
デフォルト | パラメータの説明 | 詳細に説明する |
128 | アプリケーションマスターによって割り当てられたコンテナのサイズ(M単位) |
tez.am.launch.cmd-opts
デフォルト | パラメータの説明 | 詳細に説明する |
-Dlog4j.configurationFile = tez-container-log4j2.properties -Dtez.container.log.level = INFO -Dtez.container.root.logger = CLA | TezAppMasterプロセスの起動時に提供されるコマンドラインオプション。 Tezが自動的に決定できるように、これらのスタートアップオプションにXmxまたはXmsを設定しないでください | アクティブな設定は必要ありません |
hive.tez.container.size
デフォルト | パラメータの説明 | 詳細に説明する |
128 | Tez AppMasterがRMに適用するコンテナサイズ(M) | TEZAppMasterが占有するコンテナのサイズを積極的に設定する必要はありません。 TEZは自動的にそれにジャンプしますが、AMに適用されるコンテナーサイズはこのパラメーターで管理する必要があります |
hive.tez.java.opts (--XX:NewRatio = 8を直接設定できます)
そして(set hive.tez.java.opts = -XX:NewRatio = 8)
デフォルト | パラメータの説明 | 詳細に説明する |
-Dlog4j.configurationFile = tez-container-log4j2.properties -Dtez.container.log.level = INFO -Dtez.container.root.logger = CLA | コンテナプロセスの起動時に提供されるコマンドラインオプション。次のようなデフォルトパラメータの後にメモリパラメータオプションを追加できます。-Xmx7500m-Xms7500m | このパラメーターのサイズは、通常、hive.tez.container.sizeの80%です。このパラメーターにXmx / Xmsを直接追加することはお勧めしませんが、次のパラメーターを使用してoptsサイズを調整してください |
tez.container.max.java.heap.fraction
デフォルト | パラメータの説明 | 詳細に説明する |
0.8 | Xmx / Xmsインジケーターがhive.tez.java.opsパラメーターに設定されていない場合、TEZはこのパラメーターを選択してXmx / Xmsの値を決定し、値は0.8 * hive.tez.container.sizeです。 | この値を使用してオプションを調整することをお勧めします |
tez.runtime.io.sort.mb
デフォルト | パラメータの説明 | 詳細に説明する |
512 | 出力をソートするときのソートバッファサイズ、ユニットM | tez.runtime.io.sort.mbをhive.tez.container.sizeの40%に設定できますが、値は2GBを超えることはできません。 |
hive.auto.convert.join.noconditionaltask.size
デフォルト | パラメータの説明 | 詳細に説明する |
10,000,000 | hive.auto.convert.join.noconditionaltaskが閉じている場合、このパラメーターは有効になりません。ただし、それが開かれ、n-way接続されたテーブル/パーティションのn-1のサイズの合計がこのサイズよりも小さい場合、接続は直接mapjoinに変換されます(条件付きタスクなし)。デフォルト値は10MBです | この値は、複数のJOINテーブルのn-1個のテーブルを1つの大きなテーブルに結合し、そのテーブルをmapjoinに変換できます|値はhive.tez.container.sizeの1/3に設定できます。 |
tez.am.task.max.failed.attempts = 10
タスク間で失敗した再試行の数。デフォルトは4です。
tez.am.max.app.attemps = 5を設定します
DAGAMは再試行回数に失敗しました
2.最適化のマッピング/削減
2.1マップ数量設定
tez.grouping.min-size
tez.grouping.max-size
デフォルト | パラメータの説明 | 詳細に説明する |
50M、1G | グループ分割サイズの下限、デフォルト値は50 MBグループ分割サイズの上限、デフォルト値は1 GB | これらの2つのパラメーターを減らすとレイテンシーが改善され、これら2つのパラメーターを増やすとスループットが向上します。たとえば、128 MBのデータサイズに対して4つのマッパータスクを設定する場合、各タスクのこれら2つのパラメーターを32 MB(33,554,432バイト)に設定できます。 。 |
hive.tez.input.format
デフォルト | パラメータの説明 | 詳細に説明する |
org.apache.hadoop。 hive.ql.io.HiveInputFormat | デフォルトでhiveInputFormatでファイルを分割 | 小さいファイルが多すぎるとマップタスクの数が多くなる場合は、org.apache.hadoop.hive.ql.io.CombineHiveInputFormatを使用して小さいファイルをマージし、過剰なマップタスクの数を減らすことができます。 |
2.2数量設定を減らす
hive.tez.auto.reducer.parallelism
デフォルト | パラメータの説明 | 詳細に説明する |
false | Tezのレデューサー並列処理機能をオンにします。 trueに設定すると、tezは実行時のデータサイズに応じて削減数を動的に調整します | TEZが提供するレデューサーの数を動的に調整する機能を使用するのが最適です。 mapred.reduce.tasksパラメーターを使用してreduceの数を直接決定しないでください。次のhive.tex.min.partition.factorおよびhive.tez.max.partition.factorパラメーターは、このパラメーターがオンになっている場合にのみ使用できます。 |
hive.exec.reducers.max
デフォルト | パラメータの説明 | 詳細に説明する |
1009 | タスクで許可される削減の最大数 | このパラメーターは、mapred.reduce.tasksパラメーターを使用しない場合にのみ有効になります。 |
hive.exec.reducers.bytes.per.reducer
デフォルト | パラメータの説明 | 詳細に説明する |
256000000 | 各reduceによって処理されるデータの量。デフォルト値は256Mです。 | このパラメーターは、reduceの数を計算するための次の式を説明するために導入されました。 |
hive.tex.min.partition.factor
hive.tez.max.partition.factor
maxReduces= 分(hive.exec.reducers.max [1099]、最大((ReducerStageの見積もり/hive.exec.reducers.bytes.per.reducer)、1)。*hive.tez.max.partition.factor)
minReduces= 分(hive.exec.reducers.max [1099]、最大((ReducerStageの見積もり/hive.exec.reducers.bytes.per.reducer)、1)。*hive.tez.min.partition.factor)
デフォルト | パラメータの説明 | 詳細に説明する |
0.252 | 1.hive.tex.min.partition.factorのデフォルト値は0.252です。 hive.tez.max.partition.factorのデフォルト値は2です。これら2つの値は同じ効果があります。この値を増やすことは、レデューサーの数を増やすことを意味します。値を減らして、reduceの数を減らします | 式から、reduceの数の調整は次の3つの変数によって制御されることがわかります。 hive.exec.reducers.bytes.per.reducer、 hive.tex.min.partition.factor、hive.tex.max.partition.factor。 削減タスクによって推定されたデータが190944バイトであると仮定すると、 次に、maxReuces = min(1099、max(190944 / 256000000,1)* 2)= 2 |
tez.shuffle-vertex-manager.min-src-fraction
tez.shuffle-vertex-manager.max-src-fraction
デフォルト | パラメータの説明 | 詳細に説明する |
0.250.75 | 1.tez.shuffle-vertex-manager.min-src-fractionのデフォルト値は0.252です。 tez.shuffle-vertex-manager.max-src-fractionのデフォルト値は2です。これら2つの値は同じ効果があり、値を増やして後でステージを開始します。この値を減らして、削減段階を早く開始します | 例:すべてのマップが実行された後にreduceを実行する場合は、両方の値を1に設定できます |
- ヤーンリソースの構成とmapreduceのメモリとCPU設定を計算します
3.1スクリプト計算メモリ構成設定
計算元のアドレス:
リソース値を計算するPythonスクリプト:
オプション | 説明 |
-cコア | 各ホストのコアの数。 |
-mメモリ | 各ホストのメモリ量(GB単位)。 |
-dディスク | 各ホスト上のディスクの数。 |
-k HBASE | HBaseがインストールされている場合は「True」、それ以外の場合は「False」です。 |
次のコマンドを実行します。
python hdp-configuration-utils.py -c 16 -m 64 -d 4 -k True
戻ります:
3.2メモリ構成設定を手動で計算する
このセクションでは、ノードのハードウェア仕様に従ってYARNおよびMapReduceのメモリ割り当て設定を手動で構成する方法について説明します。
YARNは、クラスター内の各コンピューターで使用可能なすべてのコンピューティングリソースを考慮します。利用可能なリソースに基づいて、YARNはクラスターで実行されているアプリケーション(MapReduceなど)からのリソース要求をネゴシエートします。次に、YARNは、コンテナーを割り当てることにより、各アプリケーションの処理能力を提供します。コンテナは、YARNの処理能力の基本単位であり、リソース要素(メモリ、CPUなど)のカプセル化です。
Hadoopクラスターでは、メモリ(RAM)、プロセッサー(CPUコア)、およびディスクの使用のバランスを取り、これらのクラスターリソースによって処理が制約されないようにすることが重要です。一般的な推奨事項として、ディスクごとおよびコアごとに2つのコンテナーを許可すると、クラスターの使用率に最適なバランスを提供できます。
クラスタノードに適切なYARNおよびMapReduceメモリ構成を決定するときは、利用可能なハードウェアリソースから始めます。具体的には、各ノードで次の値に注意してください:
- RAM(メモリの量)
- CORES(CPUコアの数)
- ディスク(ディスクの数 )。
YARNとMapReduceの使用可能なRAMの合計は、予約済みメモリを考慮する必要があります。予約済みメモリは、システムプロセスおよびその他のHadoopプロセス(HBaseなど)に必要なRAMです。
予約済みメモリ=スタックメモリ予約+ HBaseメモリ予約(HBaseが同じノード上にある場合)
次の表を使用して、各ノードの予約済みメモリを決定します。
推奨されるメモリ予約
各ノードの合計メモリ | 推奨される予約済みシステムメモリ | 推奨される予約済みHBaseメモリ |
4ギガバイト | 1 GB | 1 GB |
8 GB | 2 GB | 1 GB |
16ギガバイト | 2 GB | 2 GB |
24 GB | 4ギガバイト | 4ギガバイト |
48 GB | 6 GB | 8 GB |
64 GB | 8 GB | 8 GB |
72 GB | 8 GB | 8 GB |
96 GB | 12 GB | 16ギガバイト |
128 GB | 24 GB | 24 GB |
256 GB | 32 GB | 32 GB |
512 GB | 64 GB | 64 GB |
次の計算は、ノードごとに許可されるコンテナーの最大数を決定することです。次の式を使用できます。
コンテナの数=最小値(2 * CORES、1.8 * DISKS、(使用可能なRAMの合計)/ MIN_CONTAINER_SIZE)
ここで、MIN_CONTAINER_SIZEはコンテナの最小サイズ(RAM内)です。この値は、使用可能なRAMの量によって異なります。メモリノードが小さい場合は、コンテナの最小サイズも小さくする必要があります。次の表は、推奨値をまとめたものです。
各ノードの合計RAM | 推奨される最小コンテナサイズ |
4GB未満 | 256 MB |
4 GB〜8 GB | 512メガバイト |
8 GB〜24 GB | 1024メガバイト |
24GB以上 | 2048 MB |
最終的な計算は、各コンテナのRAMの量を決定することです。
コンテナあたりのRAM =最大(MIN_CONTAINER_SIZE、(使用可能なRAMの合計)/コンテナ)
これらの計算を通じて、YARNおよびMapReduce構成をセットアップできます。
構成ファイル | 構成設定 | 値の計算 |
糸-site.xml | 糸.nodemanager.resource.memory-mb | =コンテナ*コンテナあたりのRAM |
糸-site.xml | ヤーンスケジューラの最小割り当てMB | =コンテナあたりのRAM |
糸-site.xml | 糸.scheduler.maximum-allocation-mb | =コンテナ*コンテナあたりのRAM |
mapred-site.xml | mapreduce.map.memory.mb | =コンテナあたりのRAM |
mapred-site.xml | mapreduce.reduce.memory.mb | = 2 *コンテナあたりのRAM |
mapred-site.xml | mapreduce.map.java.opts | = 0.8 *コンテナあたりのRAM |
mapred-site.xml | mapreduce.reduce.java.opts | = 0.8 * 2 *コンテナあたりのRAM |
糸-site.xml(チェック) | 糸.app.mapreduce.am.resource.mb | = 2 *コンテナあたりのRAM |
糸-site.xml(チェック) | 糸.app.mapreduce.am.command-opts | = 0.8 * 2 *コンテナあたりのRAM |
注:インストール後、yarn-site.xmlとmapred-site.xmlの両方が/ etc / hadoop / confフォルダーにあります。
例
クラスターノードには、12個のCPUコア、48 GBのRAM、12個のディスクがあります。
予約済みメモリ=システムメモリ用に予約された6GB +(HBaseの場合)はHBase 8 GB
最小コンテナサイズ= 2 GB
HBaseがない場合:
コンテナ数=最小値(2 * 12、1.8 * 12、(48-6)/ 2)=最小値(24、21.6、21)= 21
コンテナあたりのRAM =最大(2、(48-6)/ 21)=最大(2、2)= 2
構成 | 値の計算 |
糸.nodemanager.resource.memory-mb | = 21 * 2 = 42 * 1024 MB |
糸.scheduler.minimum-allocation-mb | = 2 * 1024 MB |
糸.scheduler.maximum-allocation-mb | = 21 * 2 = 42 * 1024 MB |
mapreduce.map.memory.mb | = 2 * 1024 MB |
mapreduce.reduce.memory.mb | = 2 * 2 = 4 * 1024 MB |
mapreduce.map.java.opts | = 0.8 * 2 = 1.6 * 1024 MB |
mapreduce.reduce.java.opts | = 0.8 * 2 * 2 = 3.2 * 1024 MB |
糸.app.mapreduce.am.resource.mb | = 2 * 2 = 4 * 1024 MB |
糸.app.mapreduce.am.command-opts | = 0.8 * 2 * 2 = 3.2 * 1024 MB |
HBaseが含まれている場合:
コンテナ数=最小値(2 * 12、1.8 * 12、(48-6-8)/ 2)=最小値(24、21.6、17)= 17
コンテナあたりのRAM =最大(2、(48-6-8)/ 17)=最大(2、2)= 2
構成 | 値の計算 |
糸.nodemanager.resource.memory-mb | = 17 * 2 = 34 * 1024 MB |
糸.scheduler.minimum-allocation-mb | = 2 * 1024 MB |
糸.scheduler.maximum-allocation-mb | = 17 * 2 = 34 * 1024 MB |
mapreduce.map.memory.mb | = 2 * 1024 MB |
mapreduce.reduce.memory.mb | = 2 * 2 = 4 * 1024 MB |
mapreduce.map.java.opts | = 0.8 * 2 = 1.6 * 1024 MB |
mapreduce.reduce.java.opts | = 0.8 * 2 * 2 = 3.2 * 1024 MB |
糸.app.mapreduce.am.resource.mb | = 2 * 2 = 4 * 1024 MB |
糸.app.mapreduce.am.command-opts | = 0.8 * 2 * 2 = 3.2 * 1024 MB |
3.3 ノート:
1、 ヤーン.scheduler.minimum-allocation-mbを変更せずにyarn.nodemanager.resource.memory-mbを変更するか、yarn.scheduler.minimum-allocation-mbを変更せずにyarn.nodemanager.resource.memory-mbを変更します。ノード。
二、 インストールされているRAMが高いが、ディスク/コアの数が少ない場合は、yarn.scheduler.minimum-allocation-mbとyarn.nodemanager.resource.memory-mbを減らすことで、他のタスクのためにRAMを解放できます。
3 。 3 .1。 YARNでMapReduceメモリ設定を構成する
MapReduceはYARNで実行され、YARNコンテナーを使用してMapタスクとReduceタスクを計画および実行します。 YARNでMapReduceリソース使用率を構成するときは、次の3つの側面を考慮する必要があります。
- 各MapandReduceタスクの物理RAM制限。
- 各タスクのJVMヒープサイズ制限。
- 各タスクが受け取る仮想メモリの量。
Map andReduceタスクごとに最大メモリ量を定義できます。各MapおよびReduceタスクは個別のコンテナーで実行されるため、これらの最大メモリー設定は、YARNの最小コンテナー割り当て以上である必要があります。
前のセクションで使用したクラスターの例(48 GB RAM、12ディスク、および12コア)の場合、コンテナーの最小RAM(yarn.scheduler.minimum-allocation-mb)= 2GBです。したがって、Mapタスクコンテナに4 GB、Reduceタスクコンテナに8GBを割り当てます。
でmapred-site.xml:
mapreduce.map.memory.mb
4096
mapreduce.reduce.memory.mb
8192
各コンテナは、MapおよびReduceタスク用にJVMを実行します。 JVMヒープサイズは、「マッピングコンテナ」および「シュリンクコンテナ」の値よりも小さく設定して、YARNによって割り当てられたコンテナメモリの範囲内に収める必要があります。
でmapred-site.xml:
mapreduce.map.java.opts
-Xmx3072m
mapreduce.reduce.java.opts
-Xmx6144m
前述の設定は、MapタスクとReduceタスクが使用する物理RAMの上限を構成します。各Mapand Reduceタスクの仮想メモリ(物理+ページングメモリ)の上限は、各YARNコンテナの許可された仮想メモリの比率によって決まります。次の構成プロパティを使用してこの比率を設定します。デフォルト値は2.1です。
で糸-site.xml:
糸.nodemanager.vmem-pmem-ratio
2.1
サンプルクラスターで上記の設定を使用すると、各マップタスクは次のメモリ割り当てを受け取ります。
割り当てられた物理RAMの合計= 4 GB
マップタスクコンテナの最大JVMヒープスペース= 3 GB
最大仮想メモリ= 4 * 2.1 = 8.2 GB
YARNでMapReduceを使用すると、MapタスクとReduceタスク用に事前構成された静的スロットは不要になります。クラスター全体を使用して、各ジョブのニーズに応じてMapタスクとReduceタスクを動的に割り当てることができます。この例のクラスターでは、上記の構成を使用して、YARNは各ノードに最大10個のマッパー(40/4)または5個のレデューサー(40/8)を割り当てることができます(または他のマッパーとそれぞれ40 GB以内の他のマッパー)レデューサーの組み合わせ)ノード制限)。