たごもりすメモ

コードとかその他の話とか。

fuseでhdfsをmount

CentOS 5.5 において Hadoop hdfsFUSEでmountする方法。なんだかんだでまた数時間苦労した。
基本的には MountableHDFS - Hadoop Wiki の通りなんだけど、なんか微妙に説明不足でひっかかりまくり。

あと追試してないんであんまり明らかではないが、以下のrpmインストールはしておいた方がいい。はず。kernel moduleも読み込んでおく。

 $ sudo yum install fuse fuse-devel fuse-libs
 $ sudo modprobe fuse
ant 1.7 以降を準備しろ

CentOS 5.5に入っているのは ant 1.6.5 だが、Hadoopbuild.xml は 1.7 以降でないと正常に解釈できないらしい。おとなしく最新版のtarballをダウンロードして入れておこう。展開してパスを通すだけなので意地をはるだけ無駄だ。*1

 $ wget http://apache.forthnet.gr/ant/binaries/apache-ant-1.8.2-bin.tar.gz
 $ cd /usr/lib
 $ sudo tar xfs /path/to/apache-ant-1.8.2-bin.tar.gz
 $ cd /etc/alternatives
 $ sudo ln -s /usr/lib/apache-ant-1.8.2 ant

PATHが通らなければ適当に /etc/alternatives/ant/bin/ant にaliasをはるなりなんなりする。

コンパイルは適当に

既に libhdfs.so などが適当な位置に入っていれば、必要なのは実行ファイル fuse_dfs くらいだ。なのでコンパイルは適当な場所に展開したHadoopのディレクトリツリー内で適当に行う。

 $ cd tmp/hadoop-0.20.2+320/
 $ ant compile-c++-libhdfs -Dlibhdfs=1  # これをやったら次の行のをまず実行しろとか言われた
 $ ant compile -Dcompile.c++=true -Dlibhdfs=true
 $  # libhdfs.so はもう入っているので deploy はしない 必要だったらすればいい
 $ ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1

実行すると build/contrib/fuse-dfs 内に実行ファイルができているので、適当に /usr/local/bin にでもコピーしておく。

mountはrootで

コマンドを叩いてmountする。その際に環境変数をきっちりセットしておくこと。CLASSPATHは例によってテキトー。

 $ sudo su -
 $ export JAVA_HOME=/usr/java/jdk1.6.0_23
 $ export HADOOP_HOME=/usr/local/hadoop-0.20.2+320
 $ export LD_LIBRARY_PATH=/usr/java/jdk1.6.0_23/jre/lib/amd64/server:/usr/local/hadoop-0.20.2+320/c++/lib:/usr/local/lib:/lib64
 $ export CLASSPATH=`find /usr/local/hadoop-0.20.2+320 -name '*.jar' | grep -v 'test' | grep -v 'example' | perl -e '@jars=<STDIN>;chomp @jars; print join(":",@jars);'`
 $ mkdir /mnt/hdfs
 $ fuse_dfs dfs://node01.hadoop-cluster:50071 /mnt/hdfs

LD_LIBRARY_PATH には libjvm や libhdfs のほかに libfuse のある位置なども指定してやる必要があるので注意。

これで /mnt/hdfs を ls とかしてちゃんとリストが返ってくるとか df してちゃんと空き容量が見られるとかになれば成功。おつかれさまでした。

*1:意地をはって直接 configure & make とかできないか頑張ってたが無駄だった。