昨日のhadoop-aggregateをちょこっとバージョンアップ。
で利用できます。
また https://github.com/ueshin/hadoop-aggregate/tree/hadoop-aggregate-0.0.2 でブラウズできます。
- アクセス日をキーに入れた。
- 拡張子.html以外を除外した。
- ステータスコード 200/304 以外を除外した。
- 外部ライブラリcommons-langを使うようにした。
$ git clone https://github.com/ueshin/hadoop-aggregate.git
$ cd hadoop-aggregate
$ git checkout hadoop-aggregate-0.0.2
で利用できます。
また https://github.com/ueshin/hadoop-aggregate/tree/hadoop-aggregate-0.0.2 でブラウズできます。
ポイント
アクセス日をキーに入れた。
主な理由はもちろん、いつのアクセスがどれくらいだったのかを見たいっていうのですが、文字列以外のデータをキーとして使いたかったというのも大きな理由です。org.apache.hadoop.io.Writable#write(DataOutput out)
で渡されるjava.io.DataOutput
オブジェクトにはオブジェクトを出力するメソッドがないので、java.util.Date#getTime()
のlong
値を使って読み書きをするようにしました。org.apache.hadoop.io.Text
の実装を見るとずっと難しい実装をしているようですが、まず、s
のすべての文字を表すのに必要な総バイト数が計算されます。この数値が65535
を超える場合は、UTFDataFormatException
がスローされます。
ってことは
java.io.DataOutput.html#writeUTF(java.lang.String)
に65535バイトを超える文字列を渡すことはできないってことかな?今度実験してみます。
外部ライブラリcommons-langを使うようにした。
外部ライブラリをどうやって使えばいいのかを調べるためです。ちゃんとやろうとすると、クラスパスをごにょごにょしてhadoopを起動するってことになるんでしょうけど、めんどくさそうなのでここだけで出来るお手軽にできる方法を。
やり方としては、Maven2のmaven-dependency-pluginを使ってレポジトリにあるjarファイルをtarget以下にコピーしつつ、そのjarファイルにクラスパスを通すようManifestファイルで設定してあげるやり方です。
設定はpom.xmlファイルにて。
pom.xml
<project>
・・・・
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>st.happy_camper.hadoop.aggregate.Aggregator</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<includeScope>runtime</includeScope>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
・・・・
</plugins>
・・・・
</build>
・・・・
</project>
maven-jar-plugin
のconfiguration/archive/manifest/addClasspath
とconfiguration/archive/manifest/classpathPrefix
、およびmaven-dependency-plugin
の設定によって実現しています。maven-dependency-plugin
には<executions>
タグで、package
フェーズでcopy-dependencies
ゴールが実行されるように設定されているので、$ mvn clean package
で実行できる状態になります。
$ [HADOOP_HOME]/bin/hadoop jar target/hadoop-aggregate-0.0.2.jar \
src/test/resources/ \
target/output
$ cat target/output/part-00000
外部ラリブラリの設定にはもっといい解がありそうなので今後またいろいろと試してみます。