大規模分散技術勉強会 in 名古屋 - Hadoop本読書会 - 5章 MapReduceアプリケーションの開
Hadoop本 5章 MapReduceアプリケーションの開発の疑問点や気になる点について記述してください。
※記入者、該当ページ・該当行は忘れずに書いて下さい。
Configuration
[記入者] terurou
[該当箇所] 127〜130ページ(5.1 設定API)
Configurationは .addResouce() で複数のXMLを指定できる。後から追加したリソースで定義したプロパティが、先に定義したプロパティをオーバーライドする。
<final>true</final>が指定されたプロパティはオーバーライド不可になる。
変数の展開
[記入者] terurou
[該当箇所] 130ページ(5.1.2 変数の展開)
記述内容が理解できなかった…。
-confオプションで設定ファイルの切り替え
[記入者] terurou
[該当箇所] 131〜133ページ(5.2.1 設定の管理)
hadoop -conf xxx.xml で設定ファイルが切り替えられるので、テストなどで実行環境を切り替える際に便利
ToolインタフェースとToolRunner
[記入者] terurou
[該当箇所] 133〜135ページ(5.2.2 GenericOptionParser、Tool、ToolRunner)
Toolインタフェース = Hadoopアプリケーションを実装する際にMainとなるもの、ToolRunnerクラス = Toolを実行するもの
単にMapReduceプログラムを実行するだけならhadoopコマンドだけで済むが、テスト/デバッグを行う際にはToolを実装したほうが良いみたい。
mapper, reducerのUnit Test
[記入者] terurou
[該当箇所] 137〜140ページ(5.3 ユニットテストの作成)
mapper, reducerは処理結果をreturnで返すのではなく、OutputCollectorに対して書き込みを行うインタフェースになっているため、そのままでは処理結果の検証ができない。
MockitoなどのモックフレームワークでOutputCollectorのモックを作成すると良い。
ローカルJobRunner
[記入者] terurou
[該当箇所] 140〜142ページ(5.4.1 ローカルJobRunnerでのジョブの実行)
MapReduceプログラムのシンプルなテスト用途に設計された縮小バージョンのMapReduce実行エンジン。
デバッガ上で動作させ、ステップ実行することができる。
完全なMapReduce実行エンジンとは異なり、reducerを1個しか(0個も可)実行できない制約がある。
設定ファイルでmapred.job.trackerプロパティがlocalに設定されていると、ローカルJobRunnerが有効になる。
ミニクラスタ
[記入者] terurou
[該当箇所] 144〜146ページ(5.4.2 ドライバのテスト)
MiniDFSCluster, MiniMRClusterという、プログラムからプロセス内にクラスタを生成するクラスが存在する。
完全なHDFS、MapReduceの構成に対しテストを実施できる。
Hadoop自身の自動テストスイートで広く使われている。
デバッグし辛い欠点がある。
クラスタ上で実行する際の基本手順
[記入者] terurou
[該当箇所] 146〜153ページ(5.5 ドライバのテスト)
パッケージ(jar)化
ジョブの起動 hadoop jar xxx.jar ...
ジョブの実行状況のWeb UでのI監視
http://jobtracker-host:50030/
結果の取得、確認
エラーログの出力
[記入者] terurou
[該当箇所] 153〜155ページ(5.5.5 ジョブのデバッグ)
System.errに出力するとログファイルに出力される。
参考:
Hadoop プログラムの単純なデバッグ方法について
Chukuwa
[記入者] terurou
[該当箇所] 154ページ(5.5.5 ジョブのデバッグ)
Hadoopのサブプロジェクト、ジョブが出力したログ分析にも使える。
「Chukwa は、大規模分散システムを管理するためのオープンソースのデータ収集システムです。」
http://oss.infoscience.co.jp/hadoop/chukwa/index.h...
異常レコードの取り扱い
[記入者] terurou
[該当箇所] 157-159ページ(5.5.5 ジョブのデバッグ)
大規模なデータに関する問題の多くでは、異常なレコードは廃棄してしまうのが標準のやり方
特異点を求めるような場合に廃棄してしまっては元も子もないので、注意が必要
単にプログラムバグの可能性もあるので、異常レコードを発見したらレコードをログに出力すべき
リモートデバッガの基本的な使用手順
[記入者] terurou
[該当箇所] 159-161ページ(5.5.6 リモートデバッガの利用)
ジョブ実行時の生成される中間データを全て保存するように設定を変更する。keep.failed.task.fileをtrueに。
ジョブを実行し、Web UIからエラーが発生したノードとタスク試行ID(attempt_)を記録する。
エラーが発生したノードにログインし、タスク試行IDの中間データを探す。
エラーが発生したタスクの中間データをIsolatedRunnerに渡して起動する。
ジョブのチューニング時のチェックポイント
[記入者] terurou
[該当箇所] 161ページ(5.6 ジョブのチューニング)
mapperの数 → 平均して数秒単位であれば、もっと長く実行されるように
reducerの数 → クラスタのreduceスロット数よりわずかに少なくなるように
combiner → 可能な限り利用して転送するデータ量を減らす
中間データの圧縮 → ほとんどのケースでパフォーマンス改善
カスタムのシリアライゼーション → カスタムのWritableを使っている場合はRawComparatorを利用するように
シャッフルの調整
タスクのプロファイリング
[記入者] terurou
[該当箇所] 162ページ(5.6.1 ジョブのチューニング)
チューニングを行う際は、プロファイラを使って実行時間やメモリ使用量を取得しましょうね
ローカルJobRunnerに対してプロファイラをかけるのはあまり意味が無い。クラスタに対してプロファイラをかけるべき。
HPROFプロファイラ
[記入者] terurou
[該当箇所] 162-164ページ(5.6.1.1 HPROFプロファイラ)
JDK付属のプロファイラ
設定を変更すると利用できる。
Hadoopのジョブ設計の原則
[記入者] terurou
[該当箇所] 165ページ(5.7 MapReduceのワークフロー)
ジョブは複雑にするのではなく、ジョブの数を増やせ
DAG(非循環有向グラフ)って何?
[記入者] terurou
[該当箇所] 166ページ(5.7.2 依存ジョブの実行)
このあたりの図を参照
http://mikilab.doshisha.ac.jp/dia/research/report/...
http://hohehohe2.hp.infoseek.co.jp/openMaya/5DAG.h...
そういえばHadoop座談会#01で、みんなDAGって言ってた
依存ジョブの実行
[記入者] terurou
[該当箇所] 166-167ページ(5.7.2 依存ジョブの実行)
直線的な連鎖の場合、単純に先行ジョブが終了するまで待っていればよい。
DAGを形成するジョブの場合はJobControlやOozieを利用する。
Oozieのニュース→
米Yahoo!、Hadoopのセキュリティ強化版とワークフローエンジンをオープンソースに
http://yahoo.github.com/oozie/releases/2.0.0/
http://metasearch.sourceforge.jp/wiki/index.php?Oo...