hadoopアドベントカレンダー2011 7日目 gzip圧縮

クレジットカード現金化詐欺【業界人が教える口コミ情報】の12/7を担当するwyukawaです。

今日はHadoopの圧縮ネタでいきます。

圧縮ったっていろいろあるわけですがgzipでいきます。

容量節約のためにも圧縮は重要です。

象本にも圧縮のことは詳しく書かれていますが、yum install hadoop-0.20だけだと実はgzip圧縮は使えません。

java.lang.IllegalArgumentException: SequenceFile doesn't work with GzipCodec without native-hadoop code! 

と言われます。

これはどういうことかというとですね、gzip圧縮機能はネイティブライブラリを使うのですが、それが無いと言われています。

ネイティブライブラリをインストールするには下記のようにします。

yum install hadoop-0.20-native

TaskTrackerが動く全マシンにインストールする必要があります。またTaskTrackerの再起動が必要です。

ネイティブライブラリをJNI経由でよぶことでgzip圧縮機能を実現しています。ピュアJavaじゃないわけです。

hadoop-0.20-nativeをインストールすると${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}以下に共有ライブラリlibhadoop.soができます。

共有ライブラリlibhadoop.soをロードするためにはシステムプロパティjava.library.pathにlibhadoop.soへのパス(${HADOOP_HOME}/lib/native/${JAVA_PLATFORM})をセットする必要がありますが、これはスクリプト${HADOOP_HOME}/bin/hadoopで行われています。

Hadoopジョブは上記で設定されたシステムプロパティjava.library.pathを使って共有ライブラリlibhadoop.soをロードします。
TaskTrackerを再起動しないとシステムプロパティjava.library.pathの値が古いままとなってしまいロードに失敗します。

TaskTrackerを再起動すれば${HADOOP_HOME}/bin/hadoopも実行されるためシステムプロパティjava.library.pathが再設定され、ジョブも実行できるようになります。