kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

HDFSのマウント

Hadoop WikiMountableHDFS というのがあり、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 が書き換えできないから、そういうものだと思っておく。