libhdfsを使う(その0)

コンパイルから実行までに1時間くらいかかったわけですが、95%はCLASSPATHの効率的な指定方法を調査していた時間ですw 以下、pathは適当に自分の環境に合うように置き換えて読んでください。

libhdfsを使ったソースファイルは以下のようにコンパイルします。Linuxに詳しくないので、詳しい人はもっとちゃんとした方法を教えてください。まず、LD_LIBRARY_PATHをexportしておきます。

export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun/jre/lib/amd64/server/:$(HADOOP_HOME)/build/libhdfs/

次にlibhdfsをリンクしつつコンパイルします。

$ g++ -L$(HADOOP_HOME)/build/libhdfs -lhdfs その他のオプションなど

makeを使えば軽減されますがめんどくさす。

コンパイルしたものは以下のように実行します。LD_LIBRARY_PATHは前述のものをあらかじめexportしておくか、以下のように指定しつつ実行します。

$ LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun/jre/lib/amd64/server/:$(HADOOP_HOME)/build/libhdfs/ ./a.out

これで実行されれば良いのですが、libhdfsのためにhadoopの各種.jarを指定したCLASSPATHを与えなければ動きません(http://hadoop.apache.org/core/docs/r0.20.0/libhdfs.html:ここを参照)。そこでCLASSPATHを設定しなければならないわけですが…。

CLASSPATHに含めるものは良く分からなかったので、とりあえず$(HADOOP_HOME)と$(HADOOP_HOME)/libに含まれているjarファイルをすべてCLASSPATHに含めることにしました。lsしてみると分かりますが結構な数ですね非常に面倒くさいです。javaコマンドで起動する場合はワイルドカード指定が可能なようですが、環境変数として指定する場合はワイルドカードは使えないようです。Javaに詳しい方、なんか良い方法があったら教えて欲しいです(「eclipse使え」以外で)。

まあそんなわけで以下のようなものをexportしたら無事に動きました。

export CLASSPATH=$(HADOOP_HOME)/hadoop-0.18.3-core.jar:$(HADOOP_HOME)/hadoop-0.\
18.3-tools.jar:$(HADOOP_HOME)/lib/commons-cli-2.0-SNAPSHOT.jar:$(HADOOP_HOME)/l\
ib/commons-codec-1.3.jar:$(HADOOP_HOME)/lib/commons-httpclient-3.0.1.jar:$(HADO\
OP_HOME)/lib/commons-logging-1.0.4.jar:$(HADOOP_HOME)/lib/commons-logging-api-1\
.0.4.jar:$(HADOOP_HOME)/lib/commons-net-1.4.1.jar:$(HADOOP_HOME)/lib/jets3t-0.6\
.0.jar:$(HADOOP_HOME)/lib/jetty-5.1.4.jar:$(HADOOP_HOME)/lib/junit-3.8.1.jar:$(\
HADOOP_HOME)/lib/kfs-0.1.3.jar:$(HADOOP_HOME)/lib/log4j-1.2.15.jar:$(HADOOP_HOM\
E)/lib/oro-2.0.8.jar:$(HADOOP_HOME)/lib/servlet-api.jar:$(HADOOP_HOME)/lib/slf4\
j-api-1.4.3.jar:$(HADOOP_HOME)/lib/slf4j-log4j12-1.4.3.jar:$(HADOOP_HOME)/lib/x\
mlenc-0.52.jar

/(^o^)\