CentOS 5.5 において Hadoop hdfs をFUSEで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 だが、Hadoop の build.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 とかできないか頑張ってたが無駄だった。