1年以上のご無沙汰でした。
お久しぶりです。
さすがにこれだけ期間が開くとHadoopのバージョンも0.20.2が最新となっています。(2010/04/22現在)
そこで、以前実装したhadoop-aggregate-0.0.2を元に、hadoop-core-0.20.2の最新APIに更新してみようと思います。
以前と同じように、
で利用できます。
また https://github.com/ueshin/hadoop-aggregate/tree/hadoop-aggregate-0.20.1 でブラウズできます。
お久しぶりです。
さすがにこれだけ期間が開くとHadoopのバージョンも0.20.2が最新となっています。(2010/04/22現在)
そこで、以前実装したhadoop-aggregate-0.0.2を元に、hadoop-core-0.20.2の最新APIに更新してみようと思います。
以前と同じように、
$ git clone https://github.com/ueshin/hadoop-aggregate.git
$ cd hadoop-aggregate
$ git checkout hadoop-aggregate-0.20.1
で利用できます。
また https://github.com/ueshin/hadoop-aggregate/tree/hadoop-aggregate-0.20.1 でブラウズできます。
ポイント
pom.xml
pom.xmlファイルはこちらを参照。 (diff)hadoop-core
のバージョンを 0.18.1 だったものを 0.20.2 に更新。以前はMaven2レポジトリになかったけど、最新版は置いてありました。
Hadoopサーバー用の依存が多いので、excludeしておきます。
新旧APIの違い
当該箇所のソースファイルはこちらを参照。 (diff)パッケージが新しくなっています。
(
org.apache.hadoop.mapred
→ org.apache.hadoop.mapreduce
)古いAPIでは
interface
だったMapper
/ Reducer
が、class
になっています。MapReduceBase
を継承、Mapper
/ Reducer
をimplements
だったものが、Mapper
/ Reducer
を直接継承する形になっています。map
/ reduce
メソッドの引数が変わっています。以前は
key
とvalue
の他にOutputCollector
とReporter
を引数でとるようになっていましたが、Context
クラスに集約されました。reduce
メソッドの方のvalues
は、Iterator
だったものがIterable
に変わっています。これにより拡張for文でループさせることができるようになりました。
今回の対象のような簡単なサンプルであれば、上記くらいの修正で新しいAPIに移行することができました。
ところで、古いAPIは依然として利用できますので、無理に新しいAPIを利用する必要は(まだ)ありません。
実行
以前Application Assembler Maven Pluginで紹介した、appassemblerを利用して起動するようにpom.xmlファイルを修正してあります。$ mvn clean package
$ cd target/appassembler/
$ sh bin/aggregator <in-dir> <out-dir>
<in-dir>
にCombined
形式のApacheアクセスログを設置しておいてください。注意
<in-dir>
古いAPIでは、<in-dir>
にファイルが無かった場合にもタスク0件で処理されていたんですが、新しいAPIではjava.lang.IndexOutOfBoundsException
が発生してしまうようです。スタンドアロンのみ
現状ですと、外部ライブラリ(commons-lang
)を利用しているので、このままでは分散環境で利用できません。分散環境で実行する場合には、各ノード上でクラスパスを通しておくなどする必要があります。