零、環境
- ubuntu 9.04
- kernel 2.6.24-24-generic (原本預設為 2.6.28-15 )
- 請重新開機於grub 切換成第三個kernel,否則無法 modprobe fuse
- hadoop 0.20.1 (安裝於/opt/hadoop-0.20.1)
- fuse 版本 (FUSE_HOME = /usr/local)
- tarball 版為 2.7.4 ,此目的為了使FUSE_HOME 於 /usr/local (應該可以不用做此步)
- 而/lib/modules/2.6.24-24-generic/kernel/fs/fuse/fuse.ko 此fuse模組檔為安裝 linux-image-2.6.24-24-generic.deb時就有
- automake 1.9.x 以上
- sudo apt-get install automake 可得 1.10.2
一、安裝
1. 載入fuse的kernel module
$ sudo apt-get install linux-image-2.6.24-24-generic fuse-utils libfuse-dev libfuse2 automake
重開機,於grub 挑選linux-image-2.6.24-24-generic (第三個)
開機完後,載入fuse 的 kernel module (也可不sudo)
$ modprobe fuse
2. 編譯 fuse-hdfs
改 /opt/hadoop-0.20.1/build.xml 的 1046行左右,去掉 doc相關敘述,如下:
<target name="package" depends="compile, jar, examples, tools-jar, jar-test, ant-tasks, package-librecordio"
接著開始編譯
$ cd /opt/hadoop-0.20.1 $ ant compile-c++-libhdfs -Dlibhdfs=1 $ ant package $ ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
完成則 /opt/hadoop-0.20.1/內增加 build 資料夾,為編譯過後的hadoop ,版本為 0.20.2
而/opt/hadoop-0.20.1/build/contrib/ 內則有 fuse-dfs 資料夾,此資料夾內的檔案fuse_dfs與fuse_dfs_wraper.sh 則是掛載hdfs的重要程式
接著將/opt/hadoop-0.20.1/build 製作成hadoop工作目錄,並且將hadoop重新啟動(假設$hadoop/conf內的設定檔已設定完成)
$ cp -rf /opt/hadoop-0.20.1/build /opt/hadoop $ cp -rf /opt/hadoop-0.20.1/bin /opt/hadoop/ $ cp -rf /opt/hadoop-0.20.1/conf /opt/hadoop/ $ cp -rf /opt/hadoop-0.20.1/lib /opt/hadoop/ $ mkdir /opt/hadoop/logs $ cd /opt/hadoop $ rm -rf /tmp/hadoop* ; rm logs/* $ bin/hadoop namenode -format ; bin/start-all
3. 設定 fuse_dfs 的環境參數
請檢查 /opt/hadoop/contrib/fuse-dfs/fuse_dfs_wrapper.sh 檔內的設定檔是否符合系統環境
export HADOOP_HOME=/opt/hadoop export OS_ARCH=i386 export JAVA_HOME=/usr/lib/jvm/java-6-sun export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:/opt/hadoop/libhdfs:/usr/local/lib
找出libhdfs.so並放到$LD_LIBRARY_PATH內,
$ cd /opt/hadoop $ mkdir libhdfs $ sudo cp /opt/hadoop-0.20.1/c++/Linux-i386-32/lib/libhdfs.so ./libhdfs/
之後執行 fuse_dfs_wrapper.sh 則出現以下訊息
$ cd /opt/hadoop/build/contrib/fuse-dfs/ $ ./fuse_dfs_wrapper.sh USAGE: /opt/hadoop/contrib/fuse-dfs/fuse_dfs [debug] [--help] [--version] [-oprotected=<colon_seped_list_of_paths] [rw] [-onotrash] [-ousetrash] [-obig_writes] [-oprivate (single user)] [ro] [-oserver=<hadoop_servername>] [-oport=<hadoop_port>] [-oentry_timeout=<secs>] [-oattribute_timeout=<secs>] [-odirect_io] [-onopoermissions] [-o<other fuse option>] <mntpoint> [fuse options] NOTE: debugging option for fuse is -debug
ps . 若遇到錯誤請往前檢查
二、執行
之後的範例會將hdfs掛載於 /tmp/fusehdfs 下,掛載成功後,可直接到 /tmp/fusehdfs 內進行ls, rm , cp 等指令
$ mkdir /tmp/fusehdfs $ cd /opt/hadoop/contrib/fuse-dfs
1. 掛載hdfs-fuse
- 法1. 用以下方法可以讓hdfs 掛載於 /tmp/fusehdfs
$ fuse_dfs_wrapper.sh dfs://secuse.nchc.org.tw:9000 /tmp/fusehdfs
- 法2. 的效果與法一相同,但可以透過-o 來加入參數
$ fuse_dfs_wrapper.sh rw -oserver=secuse.nchc.org.tw -oport=9000 /tmp/fusehdfs
- 法3. 開啟 debug模式,於另外一個視窗可以自由下達 讀、寫、新增、刪除檔案 等指令
$ fuse_dfs_wrapper.sh rw -oserver=secuse.nchc.org.tw -oport=9000 /tmp/fusehdfs -odebug
卸載hdfs-fuse
$ fuseumount -u /tmp/fusehdfs
三、補充
加入以下內容到 /etc/fstab
fuse_dfs#dfs://hadoop_server.foo.com:9000 /export/hdfs fuse -oallow_other,rw,-ousetrash,-oinitchecks 0 0
好處是之後就可以用mount 指令來掛載
$ sudo mount /tmp/fusehdfs $ sudo umount /tmp/fusehdfs
缺點是用root mount 會導致權限問題,與因為export參數不完全,導致找不到libhdfs.so.0
四、除錯
ant 時檢查check java5 或 forest 等錯誤訊息
- 改 build.xml 的 1046行左右,去掉 doc相關敘述,如下:
<target name="package" depends="compile, jar, examples, tools-jar, jar-test, ant-tasks, package-librecordio"
出現找不到 libhdfs.so.0
如:fuse_dfs: error while loading shared libraries: libhdfs.so.0:
- 可檢查LD_LIBRARY_PATH是否設定正確:
- 並複製libhdfs.so(/opt/hadoop-0.20.1/c++/Linux-i386-32/lib/libhdfs.so )到該路徑內;
- 再鍊結 libhdfs.so.0 -> libhdfs.so