Hive、Tez、Yarnリソースの問題の概要と最適化パラメーター



Hive Tez Yarn Resource Problem Summary



  1. 問題が解決しました

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

スパーク問題解決を含みます。

  1. 次の異常が発生します。

使用可能なコンテナコンテナが割り当てられていないことを示します。コンテナリソースがプリエンプトされるか、リソースが不十分なため、タスクの再試行の失敗の最大数はデフォルトで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も大きすぎることはできません。設定が大きすぎると、次のエラーが直接発​​生します。

  1. 次の異常なエラーメッセージが表示されます。

mapred-sit.xmlファイルで構成されたmapreduce.task.io.sort.mb = 307はリングバッファーのサイズを示しているため、

上の図では、tez.java.optsは128Mに設定されていますが、これは明らかに307Mよりも小さくなっています。エラーメッセージからわかるように、hive.tez.java.optsを307 /0.8にリセットします。

  1. 詳細な最適化パラメータ

バックグラウンド

テズは、ハイブの一般的に使用されるエンジンの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に設定できます

  1. ヤーンリソースの構成とmapreduceのメモリとCPU設定を計算します

3.1スクリプト計算メモリ構成設定

計算元のアドレス:

https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html

リソース値を計算する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メモリ構成を決定するときは、利用可能なハードウェアリソースから始めます。具体的には、各ノードで次の値に注意してください:

  1. RAM(メモリの量)
  2. CORES(CPUコアの数)
  3. ディスク(ディスクの数 )。

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つの側面を考慮する必要があります。

  1. 各MapandReduceタスクの物理RAM制限。
  2. 各タスクのJVMヒープサイズ制限。
  3. 各タスクが受け取る仮想メモリの量。

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以内の他のマッパー)レデューサーの組み合わせ)ノード制限)。