2009.11.11

HDFSをマウントして利用してみる

GFS クローンの Hadoop Distributed File System (HDFS) をfuseを利用することでローカルにマウントし、直接操作できるファイルシステムとして使えるようなので試してみた。
参考はHadoopのサイトよりMounting HDFS

今回は Ubuntu 9.04 ベースで、Hadoop はすでに別サーバで構築済みの環境で行っています。
Hadoopの構築については Hadoop/Hbase Clusterの構築 このあたりを参考にどうぞ。

1.必要ライブラリのインストール

$ sudo apt-get install default-jdk ant
$ sudu apt-get install automake autoconf libfuse-dev

完了です。

2.Hadoopの取得とhdfs用ライブラリのコンパイル
HDFSをマウントするためにはソースからライブラリをコンパイルして作成する必要があります。

まず取得と展開。
Hadoop のサイトから
[Hadoop Common] -> [Download] -> [Download a release now!]
あたりで取得できると思います。
今回は現時点で最新版の 0.20.1を利用します。

$ wget http://ftp.riken.jp/net/apache/hadoop/core/hadoop-0.20.1/hadoop-0.20.1.tar.gz
$ tar xzvf hadoop-0.20.1.tar.gz
$ mv hadoop-0.20.1 /var/hadoop
$ cd /var/hadoop

そしてコンパイル。

$ ant compile-c++-libhdfs -Dlibhdfs=1 -Dcompile.c++=1
$ ln -s c++/Linux-i386-32/lib/ build/libhdfs
$ ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1

compile-c++-libhdfs の部分は
Hdoop-0.19 のバージョンでは ant のターゲットで「compile-libhdfs」を指定するみたいですが
0.20 ではなくなってました。
詳しくはbuild.xmlを見てください。

そしてできたファイルをコピー。

$ mkdir -p contrib/fuse-dfs
$ cd contrib/fuse-dfs
$ cp /var/hadoop/src/contrib/fuse-dfs/src/fuse_dfs ./
$ cp /var/hadoop/src/contrib/fuse-dfs/src/fuse_dfs_wrapper.sh ./
$ chmod 775 fuse_dfs_wrapper.sh

完了。

3.環境変数を追加
とりあえずテストなら実行すればいい。
継続的に使うなら「~/.profile」あたりに書いてあげるといい。
(RedHat系なら ~/.bash_profile)

$ export HADOOP_HOME=/var/hadoop
$ export OS_ARCH=i386
$ export JAVA_HOME=/usr/lib/jvm/default-java
$ export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:$HADOOP_HOME/build/libhdfs

何も指定されていないとデフォルトが使われる。
デフォルトの設定は fuse_dfs_wrapper.sh を参照。

4.接続!
mount -t dfs //hogehoge/hoge /mnt/hdfs
と行きたいところなんですがコマンドで接続です。

$ sudo mkdir /mnt/hdfs
$ sudo /var/hadoop/contrib/fuse-dfs/fuse_dfs_wrapper.sh hdfs://[hbaseserver]:54310 /mnt/hdfs

[hbaseserver] ・・・ hbaseが動いているサーバ名を指定

完了です!

5.こんなことに使える
普通にローカルにマウントされているのでそのままコマンド使えます。
ドキュメントによると
‘ls’, ‘cd’, ‘cp’, ‘mkdir’, ‘find’, ‘grep’
このあたりは問題なく使え、その他読み込み書き込みもおっけーだそうです。

ただ、HDFSの仕様上、直接編集作業を行うことはできません。
そこだけはご注意を。