Hadoop MapReduceプログラムを解剖する
オープンソース・ソフトウェア「Hadoop」のMapReduceジョブは、標準ではJavaで記述します(その他には、Pig、Hive、JAQLといったものがあります)。しかし、意外と初心者には分かりにくいと筆者は感じます。本記事では、MapReduceジョブのサンプルコードを使って、できる限り正しくコードの意味を理解し、MapReduceへの入り口を示したいと思います。
HadoopでMapReduceを記述するときに使うAPIが、0.19から0.20に変わるところで新しくなっています。実は、現時点でHadoopプロジェクト本体からでさえも、新APIを使ったサンプルが提示されていません。本記事では、新しいAPIで筆者が書き直したサンプルを使って解説しますので、このサンプルは0.19以前のHadoopでは動かないことに注意してください。この記事は、0.20.2を使って検証し、解説しています。
当記事では、HadoopおよびMapReduceの紹介は省きます。既にHadoopの紹介記事などを読まれたり、環境構築をされたりしたあとで、MapReduceジョブのソースコードをきちんと理解したいと思う方を対象にしています。サンプルのMapReduceジョブを実行したことがあり、HDFSにファイルをコピー(hadoop fsコマンド等)などして投入できる程度の知識がある方を対象にします。
本文中、Hadoopの専門用語やクラス名、メソッド名は青の太字で表現しています。本記事では、これらをきちんと理解していただくことを目標にします。
1.配布されるコードとされないコード
ここで扱うMapReduceのサンプルコードは、以下の4つのメソッド(クラス)で成り立っています。
名称 | 種類 | 配布 | 説明 |
MyMapper | クラス | * | Mapタスクの実装 |
MyReducer | クラス | * | Reduceタスクの実装 |
MyDriver#run | メソッド | Toolのオーバーライド | |
MyDriver#main | メソッド | キックするためのmain |
表を見て分かるように、MyMapperとMyReducerは、TaskTrackerが稼働するノードで実行されます。runとmainの部分を「Driver」と呼びます。Driver最初のノードで実行され、MyMapperとMyReducerを含んだJARファイルを配布し、実行します(図1)。
MyMapperとMyReducerをJARに入れ、外から別のDriverを実行することで、1つのJARを複数の別々のクラスターへサブミットすることもできます。
多くのサンプルが、分かりやすいようにしたつもりか、1つのソースコードで説明されていると思われますが、逆に混乱させていると思います。Driver(あとで出てきますが、Configuredを継承し、Toolを実装したクラス)は配布される必要はないので、本来はMyMapperとMyReducerのみをJARに入れ、その外からmainとrunを実行するのが正しいと思います。