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



 
  