libhdfsのビルド仕方@64bit環境(hadoo-0.18.3)

libhdfsはC言語からHDFSへアクセスするためのライブラリです。が、ちょっとコンパイルでハマったのでメモしておきます。32bit環境だと問題なくビルドできるかも知れませんが、実験はしていません。また、これは0.18.3(現時点でのstable release)での話で、最新のバージョンでは直っていそうな雰囲気です(http://issues.apache.org/jira/browse/HADOOP-3344)。

libhdfsをビルドするための準備として環境変数JAVA_HOMEをexportしておく必要があります。これは$(HADOOP_HOME)/conf/hadoop-env.shに書かれているJAVA_HOMEと同一のもので大丈夫です。次にHADOOP_HOMEディレクトリで以下のコマンドを実行します。

$ ant compile-libhdfs -Dlibhdfs=1

本当はこれでビルドできるらしいのですが、以下のようなエラーがでました。

compile-libhdfs:
    [mkdir] Created dir: /home/nobu/hadoop-0.18.3/build/libhdfs
     [exec] gcc -g -Wall -O2 -fPIC -m32 -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -c hdfs.c -o /home/nobu/hadoop-0.18.3/build/libhdfs/hdfs.o
     [exec] In file included from /usr/include/features.h:354,
     [exec]                  from /usr/include/sys/types.h:27,
     [exec]                  from hdfs.h:22,
     [exec]                  from hdfs.c:19:
     [exec] /usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
     [exec] make: *** [/home/nobu/hadoop-0.18.3/build/libhdfs/hdfs.o] Error 1

libhdfsはそのままだと-m32付きでビルドされてしまいます。なので、$(HADOOP_HOME)/src/c++/libhdfs/Makefile内の-m32を手動で-m64に置き換えます。そして、再度上記のantをHADOOP_HOMEにて実行します。警告が何個か出ますが一応ビルドに成功し、$(HADOOP_HOME)/build/libhdfsに.soなどが出力されます。

自分のアプリケーションでlibhdfsをリンクしたい場合は、LD_LIBRARY_PATHなどで

  • $(JAVA_HOME)/jre/lib/$(OS_ARCH)/server (OS_ARCHはamd64など)
  • $(HADOOP_HOME)/build/libhdfs

にパスを通しておき、"-lhdfs"をつけてコンパイルすればOKです。上のパスはlibjvm.so用です。

検索に苦労したので一応エラーメッセージなどをそのまま載せています。関係のない話でたどり着いてしまった人はごめんなしあ。


そしてantの使い方が良くわからんよ!!

$ ant compile-libhdfs -Dlibhdfs=1

なんでこのように二重にフラグを立てているような感じになっているのでしょうか(compile-libhdfsだけで良さそうな気がしてしまう)。教えて偉い人。