Tech Sketch Bucket of Technical Chips by TIS Inc.

Hadoop Vaidyaを用いてMapReduceタスクの性能を診断する

Pocket

はじめに

「Hadoop」の「MapReduce」で提供している「カウンター」機能は、ジョブ(MapReduceの実行単位)の統計値を取得できる組み込み機能で、ユーザーで定義することが可能です。例えば、ジョブ実行時の読み込みバイト数やCPU時間、物理メモリ使用量といったリソース情報の統計値が取得可能で、MapReduceタスクの性能分析に役立てることができます。
Apache HadoopのMapReduceに含まれている、 「Vaidya」 (「ヴァイジャ」サンスクリット語で「医師」)は、ジョブの統計値を用いて、MapReduceタスクの性能診断を行うフレームワークです。Vaidyaを利用することで、統計値からイレギュラーなリソース使用を示すMapReduceタスクを判定するといった、性能診断プログラムを容易に作成し、実行することができます。


Vaidya利用手順

Vaidya利用には、以下手順が必要となります。

  • ジョブ実行時の統計情報を取得
  • ジョブの診断ルール作成
  • ジョブの診断プログラム作成
  • ジョブの性能診断を実施
  • 出力結果レポート(XMLファイル)を確認

例として、MapReduceサンプルプログラム WordCount.java に対して、「ジョブ実行時のCPU使用率がイレギュラーであるタスクがなかったか」という性能診断を行ってみます。

ジョブの統計情報

WordCount.java をコンパイルして実行すると、以下のように2種類の履歴ログファイルが出力結果フォルダ内の「_logs/history」に出力されます。(履歴ログファイルには、カッコ内で示すようなファイル名が付けられます)

  • 「ジョブ設定ファイル」 ( job_201212061606_0009_conf.xml )
  • 「ジョブ履歴ファイル」 ( job_201212061606_0009_1355459317657_hadoop_wordcount )

Vaidyaでは、上記 「ジョブ設定ファイル」「ジョブ履歴ファイル」 からジョブ実行時の統計情報を収集し、性能診断を行います。ここで、2つの履歴ログファイルについて簡単に説明します。

ジョブ設定ファイルとは?

ジョブ実行時の設定が出力されます。
例えば、MapReduceスクリプト内で設定したジョブ名や、core-site.xmlといったHadoop設定ファイル内における設定値です。(設定値については、 MapReduce Tutorial を参照してください)

ジョブ履歴ファイルとは?

MapReduce機能であるカウンターの情報が出力されています。
カウンターには、Hadoopが定義する「組み込みカウンター」と、ユーザーがMapReduceコード内で定義する「ユーザー定義カウンター」があり、2つの情報は、このファイル内に出力されます。

ジョブの診断ルール作成

性能診断を行うにあたり、ジョブの診断ルールを作成します。設定する項目一覧を以下に示します。

プロパティ名 説明
Title ( 必須 ) 診断項目タイトル
ClassName ( 必須 ) ジョブを診断するプログラム
Description ( 必須 ) 診断項目についての説明文
Importance ( 必須 ) テストの重要性(設定値は「High」「Medium」「Low」から選択)
SuccessThreshold ( 必須 ) ジョブを診断するプログラムによって得られた結果を評価する指標(閾値)を設定。プログラムから得られた結果が、閾値を超えない場合は「NEGATIVE(PASSED)」と評価され、閾値を超える場合は「POSITIVE(FAILED)」と評価される
Prescription 診断結果が「POSITIVE(FAILED)」の場合に、参照すべきアドバイス
InputElement ジョブを診断するプログラム内において参照可能な設定値

上記、設定項目を実装したジョブの診断ルールの例(mapreduce_job_diagnosis.xml)

ジョブの診断プログラム作成

ジョブ履歴ファイルから取得される以下の情報を使用し、Mapタスク全体の平均CPU使用率と、各MapタスクのCPU使用率を比較して、CPU使用率に偏りがないかを確認する診断プログラムを作成します。

カウンター名 説明
START_TIME Mapタスク開始タイムスタンプ
FINISH_TIME Mapタスク終了タイムスタンプ
CPU_TIME_SPENT MapタスクのCPU使用時間

MapタスクのCPU使用率に偏りがないかを診断するプログラムの例(MapsCpuUsage.java)

ジョブの性能診断を実施

Vaidya実行シェルスクリプトvaidya.shにオプションを設定し、ローカルホストで性能診断を実施します。

オプション 説明
jobconf ジョブ設定ファイルをURIで指定
joblog ジョブ履歴ファイルをURIで指定
testconf ジョブの診断ルールの定義ファイルを指定
report 出力レポートファイル名を指定(xml形式)
実行コマンド

実行結果 vaidya_report.xml

診断結果から分かること

今回、例として実行したWordCount.javaの実行時CPU使用率は、各Mapタスクにおいて均一となることを期待していました。しかし、実行結果vaidya_report.xmlを確認すると、TestResultエレメントにおいて、診断結果「POSITIVE(FAILED)」と出力されており、MapタスクのCPU使用率に偏りが発生していることが分かります。
また、ReferenceDetailsエレメントには、タスクID「task_201212061606_0009_m_000016」におけるCPU使用率が「77%」であり、Mapタスク全体のCPU使用率平均「46%」に比べ高いという情報が出力されています。
Vaidyaを利用した性能診断から分かることはここまでですが、この情報をヒントとして、該当するタスクIDを基にジョブの履歴ログファイルを確認することで、CPU使用率に偏りが出た原因を探り、改善策を検討することが可能となります。

まとめ

今回の例では、CPU時間のカウンター情報を用いて、ジョブ実行時のCPU使用率がイレギュラーであるタスクを判定するといった、性能に関する診断を行いました。この他にも、ジョブ実行の失敗回数のカウンター情報を用いることで、ジョブのエラーを検知するといった、性能診断以外への応用も可能です。
また、性能診断はプログラム化されているため、ジョブに関する性能診断を負荷なく繰り返し実行することができるようになります。

ご参考までに

ここで扱ったカウンター情報はほんの一部です。この他にもHadoopの組み込みカウンターは様々用意されています(表2)。
これらカウンター用いて、性能診断プログラムを作成する際は、MapReduceパフォーマンスチューニングについてCloudera社の記事 7 Tips for Improving MapReduce Performance が参考になります。
また、Vaidyaにはサンプルコードが付属されているので、ジョブの診断プログラム実装の際にはそちらも合わせて参考にすることをおすすめします。

表2 hadoop job -history コマンド実行によって、確認できるカウンター情報
counter.jpgのサムネイル画像 class=

エンジニア採用中!私たちと一緒に働いてみませんか?