wiki:waue/2009/1005
掛載 Fuse HDFS (0.20)

零、環境

  • 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
Last modified 15 years ago Last modified on Oct 7, 2009, 10:04:57 AM