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が再設定され、ジョブも実行できるようになります。