Hadoop >

目次

概要

Fuse-DFSは、FUSE(Filesystem in Userspace)を利用してHDFSをUNIXファイルシステム上にマウントできる機能を提供しています。

ビルド

  • Fuse-DFSはソースのみが配布されていますので、まずはビルドする必要があります。
  1. ビルドに必要な環境を整えます。AntやMavenなどの基本的なビルドツールはインストールされている前提です。
    • debian.pngDebian squeeze (fuse-2.8.4-1.1)
      $ sudo apt-get install libfuse2 libfuse-dev
      • note.pngubuntu.pngubuntu 12.10 (2.9.0-1ubuntu2): UbuntuのFUSEはすでに2.9.0に上がっているため、Fuse-DFSではまだサポートされていないようです(ビルドに失敗します)。
        $ sudo apt-get install fuse libfuse-dev
    • centos.pngCentOS 6 (fuse-2.8.3-4.el6)
      $ sudo yum install fuse fuse-devel
    • centos.pngCentOS 5 (fuse-2.7.4-8.el5)
      $ sudo yum install fuse fuse-devel
  2. ソースアーカイブを展開し、以下の要領でビルドします。
    • 1.0.x系では、libhdfs共有オブジェクトが(ソース、バイナリパッケージともに)すでに同梱されていますので、固定になっているインクルードパスをシンボリックリンクで調整の上、AntでFuse-DFSのみをビルドします。
      $ tar xvzf hadoop-1.0.4.tar.gz
      $ cd hadoop-1.0.4
      $ mkdir build
      $ ln -s ../c++ build/c++
      $ ln -s ../c++/Linux-amd64-64/lib build/libhdfs    # or ln -s ../c++/Linux-i386-32/lib build/libhdfs
      $ ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
      ...
      BUILD SUCCESSFUL
      Total time: 41 seconds
      $ ls build/contrib/fuse-dfs/
      fuse_dfs  fuse_dfs_wrapper.sh  test
    • 2.0.x系では、Mavenでのビルドに変更になっており、依存する libhdfs のビルドに ProtocolBuffers や cmake が必要になりますので、あらかじめインストールしておきます。プロジェクト定義とソースツリーを見ると、FuseDFSは contrib 扱いではなく libhdfs と統合されていますので、native プロファイルを有効化してビルドします。1.0.x系で存在していたラッパースクリプト(fuse_dfs_wrapper.sh)は見当たらないようです。
      $ tar xvzf hadoop-2.0.2-alpha-src.tar.gz
      $ cd hadoop-2.0.2-alpha-src/
      $ cd hadoop-hdfs-project/hadoop-hdfs/
      $ mvn package -DskipTests -Pnative
      ...
      $ ls target/native/main/native/fuse-dfs/
      CMakeFiles  Makefile  cmake_install.cmake  fuse_dfs  test_fuse_dfs

インストール

  1. ビルドされた実行ファイルを適当な場所に配備します。
    • 1.0.x系では通常 ${HADOOP_HOME}/contrib 以下がよいでしょう。
      $ sudo cp -R build/contrib/fuse-dfs /grid/usr/hadoop/contrib/
      $ cd /grid/usr/hadoop
      $ sudo cp contrib/fuse-dfs/fuse_dfs_wrapper.sh contrib/fuse-dfs/fuse_dfs_wrapper.sh.dist
      $ sudo chmod 755 /grid/usr/hadoop/contrib/fuse-dfs/fuse_dfs_wrapper.sh
    • 2.0.x系では、${HADOOP_PREFIX}/bin あたりが適当でしょうか。
      $ sudo cp target/native/main/native/fuse-dfs/fuse_dfs /grid/usr/hadoop/bin/
  2. 1.0.x系では、ラッパースクリプトを以下の要領で修正します。
    1. $ diff -u contrib/fuse-dfs/fuse_dfs_wrapper.sh.dist contrib/fuse-dfs/fuse_dfs_wrapper.sh
    2. --- contrib/fuse-dfs/fuse_dfs_wrapper.sh.dist 2013-01-31 19:04:51.000000000 +0900
    3. +++ contrib/fuse-dfs/fuse_dfs_wrapper.sh 2013-01-31 19:02:30.000000000 +0900
    4. @@ -14,6 +14,11 @@
    5.  # limitations under the License.
    6.  #
    7.  
    8. +export HADOOP_HOME=/grid/usr/hadoop
    9. +export OS_ARCH=amd64      # or i386
    10. +export OS_BIT_WIDTH=64    # or 32
    11. +export JAVA_HOME=/usr/lib/jvm/java-6-sun
    12. +export LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/${OS_ARCH}/server:${HADOOP_HOME}/c++/Linux-${OS_ARCH}-${OS_BIT_WIDTH}/lib
    13. +
    14.  if [ "$HADOOP_HOME" = "" ]; then
    15.  export HADOOP_HOME=/usr/local/share/hadoop
    16.  fi
    17. @@ -36,4 +41,4 @@
    18.  export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:/usr/local/share/hdfs/libhdfs/:/usr/local/lib
    19.  fi
    20.  
    21. -./fuse_dfs $@
    22. +${HADOOP_HOME}/contrib/fuse-dfs/fuse_dfs $@
  3. 利用を許可するユーザを fuse グループに追加します。
    $ sudo gpasswd -a alice fuse

HDFSのマウント

  1. 適当なマウントポイントを作成し、マウントします。
    $ mkdir -p ~/export/hdfs
    $ /grid/usr/hadoop/contrib/fuse-dfs/fuse_dfs_wrapper.sh dfs://localhost:9000/ ~/export/hdfs rw -oprivate
    port=9000,server=localhost
    fuse-dfs didn't recognize /home/alice/export/hdfs,-2
    
    $ ls -l export/hdfs
    total 8
    drwxr-xr-x 3 hdfs hdfs 4096 Jan 31 21:35 grid
    drwxr-xr-x 3 hdfs hdfs 4096 Jan 31 21:36 user
    $ ls -l export/hdfs/user
    total 4
    drwxr-xr-x 2 alice 99 4096 Jan 31 21:36 alice
    1. note.png残念ながら、Fuse-DFSは1.0.x系ではまだHadoopWithSecurityに対応していません。本格的に利用できるのは、2.0.2-alpha以降のようです(HDFS-3568)。
      $ kinit
      ...
      $ /grid/usr/hadoop/contrib/fuse-dfs/fuse_dfs_wrapper.sh dfs://localhost:9000/ ~/export/hdfs rw -oprivate
      $ ls export/hdfs
      ls: cannot access export/hdfs: Input/output error
      • 以下は対応するHDFSのログ
        1. 2013-01-31 22:02:45,221 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 9000: readAndProcess threw exception
        2.  org.apache.hadoop.security.AccessControlException: Authentication is required. Count of bytes read: 0
        3. org.apache.hadoop.security.AccessControlException: Authentication is required
        4. at org.apache.hadoop.ipc.Server$Connection.readAndProcess(Server.java:1126)
        5. at org.apache.hadoop.ipc.Server$Listener.doRead(Server.java:537)
        6. at org.apache.hadoop.ipc.Server$Listener$Reader.run(Server.java:344)
        7. at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        8. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        9. at java.lang.Thread.run(Thread.java:662)
    2. 2.0.x系では1.0.x系のようなラッパースクリプトが同梱されていませんので、手動で環境変数を整えてから fuse_dfs コマンドでマウントします。
      $ export HADOOP_HOME=/grid/usr/hadoop
      $ export OS_ARCH=amd64
      $ export JAVA_HOME=/usr/lib/jvm/java-6-sun
      $ export LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/${OS_ARCH}/server:${HADOOP_HOME}/lib/native
      
      $ /grid/usr/hadoop/bin/fuse_dfs dfs://localhost:9000/ ~/export/hdfs rw -oprivate
  2. アンマウントは、通常の fusermount で行います。
    $ fusermount -u ~/export/hdfs

参考リソース

  1. http://fuse.sourceforge.net/
  2. MountableHDFS
  3. HDFS-3568
  4. HDFS-2696

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-05-02 (木) 19:20:34 (2050d)