オリジナルのHadoop MapReduceアプリケーション第一弾、hadoop-aggregateを開発しました。
ApacheのアクセスログCombined形式のファイルから、
をTSV形式のファイルで出力します。
ApacheのアクセスログCombined形式のファイルから、
- どこから (IPアドレス)
- どのページに (URL)
- 何回アクセスしたか。
をTSV形式のファイルで出力します。
実行手順
準備
あらかじめ、MapReduceプログラム開発準備を参考にHadoopをインストールしておいてください。また、適当なサイトからApacheアクセスログCombined形式のものを手元に持ってきておいてください。
チェックアウト
$ git clone https://github.com/ueshin/hadoop-aggregate.git
$ cd hadoop-aggregate
$ git checkout hadoop-aggregate-0.0.1パッケージング
$ mvn clean package実行
持ってきたアクセスログを src/test/resources 以下に置いたものとします。複数のファイルがあっても、zlib / lzo / gzipの形式であれば圧縮されていても大丈夫です。
$ [HADOOP_HOME]/bin/hadoop jar target/hadoop-aggregate-0.0.1.jar \
src/test/resources/ \
target/output
$ cat target/output/part-00000とすると、
IP\tURL\tCount
の形式のアクセス集計が見れます。
まとめ
MapReduceの動作を調べるために試したこと。
Tool/ToolRunnerを使ってみた。Combineを入れてみた。Map→Combine→Reduce間のデータのキーを、自分で作ってみた。Combineの動きを見るため、あえてCombineの出力キーとReduceの出力キーを変えてみた。
わかったこと
Combineは、Mapが終わったらすぐに動く。Mapのタスクごとに一旦Reduceするイメージ。Combineの入力と出力は同じクラスのペアでなければならない。class Combine implements Reducer<K,V,K,V>
な感じ。- キーの作り方。
WritableComparableを実装したクラスであればいい。
実装するメソッドは次の3つ。public void readFields(DataInput in) throws IOException; public void write(DataOutput out) throws IOException; public int compareTo(AccessWritable o); Reduceの出力はToolを使った場合のデフォルトではキー、値のtoString()メソッドが呼ばれるので、toString()をオーバーライドするか、Textクラスで出力するかしなければならない。
ちょっとずつMapReduceがわかってきました。

