HDFSのマウント
Hadoop Wiki に MountableHDFS というのがあり、HDFS をマウントできるようなことが書いてあるので試してみたので、それをメモしておく。
いくつか実装があるようだけど、今回試したのは fuse-dfs というもの。こちらのサイトも参考にさせていただいた。
gcc, gcc-c++ とか ant とかいったコンパイル環境はすでに整っているものとする。とりあえず、/home/hadoop/.bashrc に以下のような記述をしてある。
export JAVA_HOME=/usr/java/latest export ANT_HOME=~/apache-ant-1.7.1 export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
まず、FUSE が必要なので、ビルド・インストールしておく。
$ tar xzf fuse-2.7.4.tar.gz $ cd fuse-2.7.4 $ ./configure --prefix=/usr $ make $ su # make install
次に、fuse-dfs 利用しているライブラリ libhdfs を作成する。Wiki に書かれている内容は古いみたいで、以下のようにすればビルドできた。(hadoop ユーザのホームディレクトリに hadoop-0.20.0 を展開しているものとして書いてます)
$ cd hadoop-0.20.0 $ ant compile-c++-libhdfs -Dlibhdfs=1 -Dcompile.c++=1
引き続いて、fuse-dfs 本体をビルドするのだけど、Makefile が build/libhdfs を決めうちで見に来るようなので、以下のようにシンボリックリンクを作成しておく。
$ ln -s c++/Linux-i386-32/lib build/libhdfs
その上で、
$ ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
として、ビルドを実行しする。
ビルドができたら、必要なものを contrib/fuse-dfs に置くことにする。
$ mkdir -p contrib/fuse-dfs $ cp src/contrib/fuse-dfs/src/fuse_dfs contrib/fuse-dfs/ $ cp src/contrib/fuse-dfs/src/fuse_dfs_wrapper.sh contrib/fuse-dfs/ $ chmod 775 contrib/fuse-dfs/fuse_dfs_wrapper.sh
そして、contrib/fuse-dfs/fuse_dfs_wrapper.sh を編集する。先頭部分に以下のように環境変数の定義を入れる。
export HADOOP_HOME=/home/hadoop/hadoop-0.20.0 export OS_ARCH=i386 export JAVA_HOME=/usr/java/latest export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:$HADOOP_HOME/build/libhdfs
また、最後の行の fuse_dfs の呼び出しも以下のように書き換えておく。
$HADOOP_HOME/contrib/fuse-dfs/fuse_dfs $@
これで作業は完了なので、以下のように実行すればマウントできる。
$ cd contrib/fuse-dfs/ $ su # mkdir -p /mnt/hdfs # ./fuse_dfs_wrapper.sh dfs://hadoop0:9000 /mnt/hdfs
また、起動時にマウントしたいのであれば、/etc/fstab に
/home/hadoop/hadoop-0.20.0/contrib/fuse-dfs/fuse_dfs_wrapper.sh#dfs://hadoop0:9000 /mnt/hdfs fuse rw,auto 0 0
のように記述しておけばよいようである。
なお、マウントした領域にファイルコピーしたり、cat でファイルを読んだりすることは問題ない。ただ、vi で既にあるファイルを書き換えてみたら、サイズ 0 のファイルになってしまった。HDFS が書き換えできないから、そういうものだと思っておく。