オリジナルの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がわかってきました。