JavaでHadoop上で動作するMapperを書こうとしたらリファレンスの言ってることが全くわからず、本を読んでもちんぷんかんぷん。

2時間位かけてようやくMapperで必要な知識を手に入れました。
ちょっとまとめてみます。

・Mapperインターフェース
JavaでMapperを書くとき、Mapperインターフェースを実装することでHadoop上で動くMapを作成することが出来ます。
Mapperインターフェースは

Interface Mapper<K1,V1,K2,V2>

という感じで定義されており、K1,V1,K2,V2 にはクラス名が入ります。
K1はMapperへの入力キーのクラス名、V1はキーに対応する入力値のクラス名となります。
同様に、K2はMapperからの出力キーのクラス名、V2はキーに対応する出力値のクラス名となります。

これらのキーと値はInputFormatと呼ばれるMapperへの入力フォーマットを表すクラスを意識する必要があります。
InputFormatによって入力のキーと値のフォーマットが決まるからです。

InputFormatにはMapperを実装するときに指定することがなければTextInputFormatがデフォルトで設定されています。

TextInputFormatでは、キーとして入力ファイルの各行の開始位置のバイト数をLongWritableクラスとして渡し、値はキーに対応するそれぞれの行となりTextクラスで渡されます。
例えば、

On the top of the Crumpetty Tree
The Quanble Wangle sat,

という文章が書かれたファイルがあったとしたら、

(0, On the top of the Crumpetty Tree)
(33, The Quanble Wangle sat,)

という感じで各Mapperへキーと値が渡されます。
つまり、先程のデータの1行目で言うと、”0”がキーにあたりLongWritableクラス。”On the top of the Crumpetty Tree”が値でTextクラスとなっています。

これだとTextInputFormatのキーは何に使ったらいいのかわかりません(自分には思いつきませんでした(ノ∀`))。
そんな訳の分からないキーよりも、入力ファイルの各行をタブ区切りのキーと値のペアにしてMapperにかけたいと思うはずです。

こんな時のために、KeyValueTextInputFormatというものが用意されています。
これは、入力ファイルの各行をタブで区切ってタブより前にあるものをキーとして、後ろにあるものを値として扱ってくれるInputFormatです。
キーと値はTextクラスとして渡されます。
例えば、

1\tアマガエル
2\tガマガエル
3\tヒキガエル

という感じで書かれたファイルがあったとしたら、

(1, アマガエル)
(2, ガマガエル)
(3, ヒキガエル)

という感じで、各Mapperへキーと値が渡されることになります。

とりあえず、自分が今のところ使う分にはこれだけの知識があれば困ることはないので、ここまでにします(もう眠いからっていうのもあります)。

では今回はこんな感じでおしまい。