HDInsight の MapReduce と Azure Data Lake Storage Gen1 のパフォーマンス チューニング ガイダンス
前提条件
- Azure サブスクリプション。 Azure 無料試用版の取得に関するページを参照してください。
- Azure Data Lake Storage Gen1 アカウント。 これを作成する手順については、Azure Data Lake Storage Gen1 の使用開始に関するページを参照してください。
- Data Lake Storage Gen1 アカウントにアクセスできる Azure HDInsight クラスター。 Data Lake Storage Gen1 を使用する HDInsight クラスターの作成に関するページを参照してください。 クラスターのリモート デスクトップが有効になっていることを確認します。
- HDInsight での MapReduce の使用。 詳細については、「HDInsight での MapReduce と Hadoop の使用」を参照してください。
- Data Lake Storage Gen1 のパフォーマンス チューニング ガイドラインを確認します。 一般的なパフォーマンスの概念については、Data Lake Storage Gen1 のパフォーマンス チューニング ガイダンスを参照してください。
パラメーター
MapReduce ジョブの実行時に、Data Lake Storage Gen1 のパフォーマンスを向上させるために構成できる最も重要なパラメーターは次のとおりです。
パラメーター | 説明 |
---|---|
Mapreduce.map.memory.mb |
各 Mapper に割り当てるメモリの量。 |
Mapreduce.job.maps |
ジョブごとのマップ タスクの数。 |
Mapreduce.reduce.memory.mb |
各 Reducer に割り当てるメモリの量。 |
Mapreduce.job.reduces |
ジョブごとの削減タスクの数。 |
mapreduce.map.memory / mapreduce.reduce.memory
この数値は、マップまたは削減タスク、あるいはその両方に必要なメモリ量に基づいて調整します。 Yarn 構成で、Ambari の mapreduce.map.memory
や mapreduce.reduce.memory
の既定値を表示できます。 Ambari で YARN に移動し、 [Configs]\(構成\) タブを表示します。YARN メモリが表示されます。
Mapreduce.job.maps / Mapreduce.job.reduces
これにより、作成する Mapper または Reducer の最大数が決まります。 分割の数によって MapReduce ジョブに作成される Mapper の数が決まります。 そのため、要求した Mapper の数よりも分割が少ないと、要求したよりも少ない数の Mapper を取得する場合があります。
ガイダンス
手順 1:実行するジョブの数を決定する
既定では、MapReduce はジョブにクラスター全体を使用します。 クラスターの使用を抑えるには、使用可能なコンテナーの数よりも少ない Mapper を使用します。 このドキュメントのガイダンスでは、お使いのアプリケーションがクラスターで唯一実行されているアプリケーションであると想定しています。
手順 2:mapreduce.map.memory/mapreduce.reduce.memory を設定する
Map タスクと Reduce タスクのメモリ サイズは、特定のジョブに依存します。 コンカレンシーを向上させるには、メモリ サイズを小さくします。 同時に実行できるタスクの数は、コンテナー数によって異なります。 Mapper や Reducer ごとのメモリの量を減らすことで、より多くのコンテナーを作成できるため、より多くの Mapper や Reducer を同時に実行できます。 メモリの量を減らし過ぎると、一部のプロセスでメモリが不足する場合があります。 ジョブの実行時にヒープ エラーが発生する場合は、Mapper や Reducer ごとのメモリを増やします。 コンテナーをさらに追加すると、追加された各コンテナーに余分なオーバーヘッドが加わり、パフォーマンスを低下させる可能性がある点を考慮してください。 別の方法としては、メモリ容量が大きいクラスターを使用してメモリ量を増やすか、クラスター内のノード数を増やすことが挙げられます。 メモリの量が増えると使用できるコンテナーの数も増えて、コンカレンシーが向上されます。
手順 3:合計 YARN メモリを決定する
mapreduce.job.maps/mapreduce.job.reduces をチューニングするには、使用可能な合計 YARN メモリの量を考慮してください。 この情報は Ambari で利用できます。 YARN に移動し、 [Configs]\(構成\) タブを表示します。YARN メモリは、このウィンドウに表示されます。 合計 YARN メモリを得るには、YARN メモリと、クラスター内のノードの数を掛けます。
Total YARN memory = nodes * YARN memory per node
空のクラスターを使用している場合、メモリはクラスターの合計 YARN メモリになります。 ほかのアプリケーションでメモリを使用している場合は、Mapper や Reducer の数を使用するコンテナーの数に減らすことで、クラスターのメモリの一部のみを使用するように選択できます。
手順 4:YARN コンテナーの数を計算する
YARN コンテナーによって、ジョブのコンカレンシーがどの程度可能かが決まります。 合計 YARN メモリを、mapreduce.map.memory で割ります。
# of YARN containers = total YARN memory / mapreduce.map.memory
手順 5:mapreduce.job.maps/mapreduce.job.reduces を設定する
mapreduce.job.maps/mapreduce.job.reduces を、少なくとも、使用可能なコンテナーの数に設定します。 さらに、Mapper や Reducer の数を増やして、パフォーマンスが向上するかを確認することができます。 Mapper の数を増やすとオーバーヘッドが追加されるため、Mapper の数が多すぎるとパフォーマンスが低下する可能性がある点にご注意ください。
CPU スケジューリングと CPU の分離は既定ではオフになっているため、YARN コンテナーの数はメモリによって制約されます。
計算例
現在 8 つの D14 ノードから成るクラスターがあり、I/O 集約型ジョブを実行するとします。 次の計算を行う必要があります。
手順 1:実行するジョブの数を決定する
この例では、実行されているジョブは 1 つだけであると想定しています。
手順 2:mapreduce.map.memory/mapreduce.reduce.memory を設定する
この例では、I/O 集約型ジョブを実行し、マップ タスクには 3 GB のメモリで十分であると判断しています。
mapreduce.map.memory = 3GB
手順 3:合計 YARN メモリを決定する
total memory from the cluster is 8 nodes * 96GB of YARN memory for a D14 = 768GB
手順 4:YARN コンテナーの数を計算する
# of YARN containers = 768 GB of available memory / 3 GB of memory = 256
手順 5:mapreduce.job.maps/mapreduce.job.reduces を設定する
mapreduce.map.jobs = 256
制限事項
Data Lake Storage Gen1 の調整
マルチテナント サービスとして、Data Lake Storage Gen1 ではアカウント レベルの帯域幅制限が設定されています。 帯域幅制限に達すると、タスク エラーが発生します。 エラーを特定するには、タスク ログの調整エラーを監視します。 ジョブにより広い帯域幅が必要な場合は、お問い合わせください。
調整されているかどうかを確認するには、クライアント側でデバッグ ログを有効にする必要があります。 その方法は次のとおりです。
[Ambari] > [YARN] > [Config] \(構成) > [Advanced yarn-log4j] \(詳細な yarn-log4j) の順に進み、log4j プロパティに「log4j.logger.com.microsoft.azure.datalake.store=DEBUG」を入力します。
すべてのノードとサービスを再起動し、構成を有効にします。
調整されている場合は、YARN ログ ファイルに HTTP 429 のエラー コードが表示されます。 YARN ログ ファイルは /tmp/<user>/yarn.log に格納されています。
実行例
Data Lake Storage Gen1 で MapReduce を実行する方法を示すために、次の設定のクラスターで実行されたサンプル コードをいくつかご紹介します。
- 16 ノード (D14 v2)
- HDI 3.6 を実行する Hadoop クラスター
最初に、MapReduce Teragen、Terasort、および Teravalidate を実行するコマンドの例を示します。 これらのコマンドは、お使いのリソースに基づいて調整できます。
Teragen
yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teragen -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 10000000000 adl://example/data/1TB-sort-input
Terasort
yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar terasort -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 -Dmapreduce.job.reduces=512 -Dmapreduce.reduce.memory.mb=3072 adl://example/data/1TB-sort-input adl://example/data/1TB-sort-output
Teravalidate
yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teravalidate -Dmapreduce.job.maps=512 -Dmapreduce.map.memory.mb=3072 adl://example/data/1TB-sort-output adl://example/data/1TB-sort-validate