Hadoop >

目次

概要

  1. Hoopは、次世代HDFS Proxyを目指し一から書き直された、RestfulなAPIを提供するHDFSプロキシサーバです。最初の開発元はClouderaですが、Apache Hadoop 0.23.xにHttpFSとしてコントリビュートされました。

セットアップ

  • Hoopは、Apache Hadoop 0.23.xの一部(HttpFS)としてコントリビュートされたため、GitHub?ソースはすでにメンテナンスされていないようです。デフォルトの 0.20.2-cdh3u0 向けにはビルド可能ですが、現在の安定版(1.0.3)向けには(一部HDFSのインタフェイスが変更になったため)ビルドに失敗します。
  • デフォルトターゲットのCDH3は、Apache 0.20.2をベースとするもののセキュリティ機能をバックポートしたバージョンですので、そのままでは実質的にApache Hadoopの1.0.x以前のバージョンに対してHoopを利用することはできません。以下で説明するセットアップ手順では多少の修正パッチを適用しビルドを通し、Apache Hadoop 1.0.x での利用を可能にしています。

デフォルト設定(0.20.2-cdh3u0向け)でのビルド

  1. jersey-project-1.4.pom のダウンロードに失敗しますので、手動で取得した後、再度ビルドします。
    $ git clone git://github.com/cloudera/hoop.git
    $ cd hoop
    $ mvn clean package site assembly:single -DskipTests
    ... (エラー)
    $ rm ~/.m2/repository/com/sun/jersey/jersey-project/1.4/*
    $ wget http://download.java.net/maven/2/com/sun/jersey/jersey-project/1.4/jersey-project-1.4.pom
    $ cp jersey-project-1.4.pom ~/.m2/repository/com/sun/jersey/jersey-project/1.4/
    $ mvn clean package site assembly:single -DskipTests

Apache Hadoop 1.0.x(安定版)向けのビルドとセットアップ

info.pngHoopでHDFSプロキシを構築する以上、きちんとした認証を施さないのでは意味がありませんので、以下の説明ではKerberos認証での設定例を示しています。シングルノードによる疑似分散環境での例ですが、完全分散環境での構築に際しては、適宜レルムやホスト名等を読み替えてください。

  1. 環境にあわせてビルドに必要なものをインストールしておきます。以下は、debian.pngDebianの場合の一例です。
    $ sudo apt-get install --no-install-recommends openjdk-6-jdk git
    $ sudo tar xvzf apache-maven-3.0.4-bin.tar.gz -C /usr/local
  2. Hadoopのターゲットバージョンの変更
    1. $ diff -u hoop.org/hoop-project/pom.xml hoop/hoop-project/pom.xml
    2. --- hoop.org/hoop-project/pom.xml       2012-07-28 22:49:38.000000000 +0900
    3. +++ hoop/hoop-project/pom.xml   2012-07-28 23:14:08.000000000 +0900
    4. @@ -50,7 +50,7 @@
    5.      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    6.      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    7.  
    8. -    <hadoop.version>0.20.2-cdh3u0</hadoop.version>
    9. +    <hadoop.version>1.0.3</hadoop.version>
    10.  
    11.    </properties>
  3. そのままではビルドは失敗します。
    $ cd hoop
    $ mvn clean package site assembly:single -DskipTests
    ...
    [INFO] -------------------------------------------------------------
    [ERROR] COMPILATION ERROR :
    [INFO] -------------------------------------------------------------
    [ERROR] /usr/local/src/hoop/hoop-server/src/main/java/com/cloudera/lib/service/hadoop/HadoopService.java:[126,56] cannot find symbol
    symbol  : method getTrimmedStringCollection(java.lang.String)
    location: class com.cloudera.lib.util.XConfiguration
    [ERROR] /usr/local/src/hoop/hoop-server/src/main/java/com/cloudera/lib/service/hadoop/HadoopService.java:[127,54] cannot find symbol
    symbol  : method getTrimmedStringCollection(java.lang.String)
    location: class com.cloudera.lib.util.XConfiguration
    [ERROR] /usr/local/src/hoop/hoop-server/src/main/java/com/cloudera/lib/service/hadoop/HadoopService.java:[233,52] cannot find symbol
    symbol  : method getTrimmed(java.lang.String)
    location: class org.apache.hadoop.conf.Configuration
    [ERROR] /usr/local/src/hoop/hoop-server/src/main/java/com/cloudera/lib/service/hadoop/HadoopService.java:[272,54] cannot find symbol
    symbol  : method getTrimmed(java.lang.String)
    location: class org.apache.hadoop.conf.Configuration
    [ERROR] /usr/local/src/hoop/hoop-server/src/main/java/com/cloudera/lib/service/hadoop/HadoopService.java:[275,52] cannot find symbol
    symbol  : method getTrimmed(java.lang.String)
    location: class org.apache.hadoop.conf.Configuration
    [INFO] 5 errors
    [INFO] -------------------------------------------------------------
  4. 修正パッチを用意しましたので、以下の修正ソースを取得するか、パッチを適用して再度ビルドします。
    1. パッチ適用済のソースをこちらに用意しています。
    2. スナップショットに対するパッチですので陳腐化するかもしれませんが、パッチ自体はfilehoop-0.1.0-SNAPSHOT-hadoop-1.0.patchです。
  5. 生成されたアーカイブを適当な場所に展開します。アーカイブにはApache Tomcatが同梱されています。
    $ sudo tar xvzf hoop-0.1.0-SNAPSHOT.tar.gz -C /grid/usr
    $ cd /grid/usr
    $ sudo ln -s hoop-0.1.0-SNAPSHOT hoop
  6. 起動ユーザを(完全分散の場合にはLDAP等に)追加し、一部のディレクトリのオーナーを変更します。
    $ sudo adduser --shell /bin/sh --uid 10010 --disabled-password hoop
    $ sudo usermod -G hadoop hoop
    $ cd /grid/usr/hoop
    $ sudo chown hoop tomcat/{temp,work}
  7. 次にHoopサーバがHDFSアクセス時のKerberos認証に必要なユーザプリンシパル(hoop@LOCALHOST)を追加します。一方ユーザがアクセスするためのSPNEGO/Kerberos用サービスプリンシパル(HTTP/localhost@LOCALHOST)は、疑似分散の場合にはすでに追加済でしょう。
    $ sudo kadmin.local
    Authenticating as principal root/admin@LOCALHOST with password.
    kadmin.local:  add_principal -randkey hoop
    WARNING: no policy specified for hoop@LOCALHOST; defaulting to no policy
    Principal "hoop@LOCALHOST" created.
    kadmin.local:  ktadd -k /grid/etc/keytabs/localhost.keytab hoop
    ...
  8. HDFSの設定ファイル(conf/core-site.xml)に、Secure Impersonation の設定を追加します。以下の設定では、プロキシユーザ hoop がlocalhostからアクセスした場合にのみ hadoopers グループに属する任意のユーザとして権限認可されます。編集後、HDFSを再起動し反映させます。
    1.     <property>
    2.         <name>hadoop.proxyuser.hoop.hosts</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-pxy.${this.domain},pxy00.${this.domain},pxy01.${this.domain}</value> -->
    5.     </property>
    6.     <property>
    7.         <name>hadoop.proxyuser.hoop.groups</name>
    8.         <value>hadoopers</value>
    9.     </property>
    1. あらかじめHoopを利用するユーザは、この場合では hadoopers グループに(完全分散の場合にはLDAP等に)追加しておきます。
      $ sudo addgroup --gid 10100 hadoopers
      $ sudo usermod -G hadoopers alice
  9. 最後に、Hoopの設定ファイルを適切に編集します。
    1. conf/hoop-env.sh: 環境にあわせて以下の要領で編集します。疑似分散環境での例ですので、localhostを明示しています。
      1. #export JAVA_HOME=/usr/lib/jvm/java-6-sun
      2. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
      3. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
      4. export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
      5. export HOOP_LOG=/grid/vol/0/var/log/hoop
      6. export HOOP_TEMP=/grid/vol/0/tmp/hoop
      7. export HOOP_HTTP_HOSTNAME=localhost
    2. conf/hoop-site.xml: Hoop上での Secure Impersonation も可能ですが、ここでは割愛します。
      1. <configuration>
      2.     <!--
      3.     <property>
      4.         <name>this.cluster.name</name>
      5.         <value>pleiades</value>
      6.     </property>
      7.     <property>
      8.         <name>this.domain</name>
      9.         <value>grid.example.com</value>
      10.     </property>
      11.     <property>
      12.         <name>this.realm</name>
      13.         <value>GRID.EXAMPLE.COM</value>
      14.     </property>
      15.     -->
      16.     <property>
      17.         <name>this.keytab.dir</name>
      18.         <value>/grid/etc/keytabs</value>
      19.     </property>
      20.  
      21.     <property>
      22.         <name>hoop.authentication.type</name>
      23.         <value>kerberos</value>
      24.     </property>
      25.     <property>
      26.         <name>hoop.authentication.kerberos.principal</name>
      27.         <value>HTTP/localhost@LOCALHOST</value>
      28.         <!-- <value>HTTP/${this.cluster.name}-pxy.${this.domain}@${this.realm}</value> -->
      29.     </property>
      30.     <property>
      31.         <name>hoop.authentication.kerberos.keytab</name>
      32.         <value>${this.keytab.dir}/localhost.keytab</value>
      33.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-pxy.keytab</value> -->
      34.     </property>
      35.     <property>
      36.         <name>hoop.hadoop.conf:fs.default.name</name>
      37.         <value>hdfs://localhost:9000</value>
      38.         <!-- <value>hdfs://${this.cluster.name}-nn.${this.domain}:9000</value> -->
      39.     </property>
      40.     <property>
      41.         <name>hoop.hadoop.conf:dfs.namenode.kerberos.principal</name>
      42.         <value>hdfs/localhost@LOCALHOST</value>
      43.         <!-- <value>hdfs/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
      44.     </property>
      45.     <property>
      46.         <name>hoop.hadoop.authentication.type</name>
      47.         <value>kerberos</value>
      48.     </property>
      49.     <property>
      50.         <name>hoop.hadoop.authentication.kerberos.principal</name>
      51.         <value>hoop@LOCALHOST</value>
      52.         <!-- <value>hoop@${this.realm}</value> -->
      53.     </property>
      54.     <property>
      55.         <name>hoop.hadoop.authentication.kerberos.keytab</name>
      56.         <value>${this.keytab.dir}/localhost.keytab</value>
      57.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-pxy.keytab</value> -->
      58.     </property>
      59. </configuration>
  10. Hoopを起動させます。
    $ sudo -u hoop bin/hoop.sh start

使用例

  1. ホームディレクトリ
    $ sudo -u alice kinit
    ...
    $ sudo -u alice curl -i --negotiate -u : "http://localhost:14000?op=homedir"
    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    WWW-Authenticate: Negotiate
    Content-Type: text/html;charset=utf-8
    Content-Length: 979
    Date: Sun, 29 Jul 2012 07:23:09 GMT
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Set-Cookie: alfredo.auth="u=alice&p=alice@LOCALHOST&t=kerberos&e=1343550189219&s=16DX4wjt3zvTSAKoXCZfiIlXeJ0="; Version=1; Path=/
    Content-Type: application/json
    Transfer-Encoding: chunked
    Date: Sun, 29 Jul 2012 07:23:09 GMT
    
    {"homeDir":"http:\/\/localhost:14000\/user\/alice"}
  2. リスト
    $ sudo -u alice curl -i --negotiate -u : "http://localhost:14000/user/alice?op=list"
    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    WWW-Authenticate: Negotiate
    Content-Type: text/html;charset=utf-8
    Content-Length: 979
    Date: Sun, 29 Jul 2012 07:26:15 GMT
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Set-Cookie: alfredo.auth="u=alice&p=alice@LOCALHOST&t=kerberos&e=1343550375026&s=5l2GlutywbhRv8f4tTJXWuReHUY="; Version=1; Path=/
    Content-Type: application/json
    Transfer-Encoding: chunked
    Date: Sun, 29 Jul 2012 07:26:15 GMT
    
    [{"path":"http:\/\/localhost:14000\/user\/alice\/.staging","isDir":true,"len":0,"owner":"alice","group":"alice",
    "permission":"-rwx------","accessTime":0,"modificationTime":1339662539679,"blockSize":0,"replication":0}]
  3. アップロード: WebHDFSと異なりプロキシですので、クライアントから見た場合1ステップでアップロードできます。
    $ cat sample.txt
    Hello Hoop!
    $ sudo -u alice curl -i --negotiate -u : -X POST "http://localhost:14000/user/alice/sample.txt?op=create" \
    > --data-binary @sample.txt --header "content-type: application/octet-stream"
    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    WWW-Authenticate: Negotiate
    Content-Type: text/html;charset=utf-8
    Content-Length: 979
    Date: Sun, 29 Jul 2012 08:25:00 GMT
    
    HTTP/1.1 201 Created
    Server: Apache-Coyote/1.1
    Set-Cookie: alfredo.auth="u=alice&p=alice@LOCALHOST&t=kerberos&e=1343553900041&s=BA1TTf5vpojgzn1SZMIIs35xmr8="; Version=1; Path=/
    Location: http://localhost:14000/user/alice/sample.txt
    Content-Type: application/json
    Content-Length: 0
    Date: Sun, 29 Jul 2012 08:25:00 GMT
  4. 読み出し
    $ sudo -u alice curl -i --negotiate -u : -X GET "http://localhost:14000/user/alice/sample.txt"
    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    WWW-Authenticate: Negotiate
    Content-Type: text/html;charset=utf-8
    Content-Length: 979
    Date: Sun, 29 Jul 2012 08:29:49 GMT
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Set-Cookie: alfredo.auth="u=alice&p=alice@LOCALHOST&t=kerberos&e=1343554189562&s=D7JPts7/UO0r9w0ClHA2tvv/fhs="; Version=1; Path=/
    Content-Type: application/octet-stream
    Transfer-Encoding: chunked
    Date: Sun, 29 Jul 2012 08:29:49 GMT
    
    Hello Hoop!
  5. 削除
    $ sudo -u alice curl -i --negotiate -u : -X DELETE "http://localhost:14000/user/alice/sample.txt?op=delete"
    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    WWW-Authenticate: Negotiate
    Content-Type: text/html;charset=utf-8
    Content-Length: 979
    Date: Sun, 29 Jul 2012 08:31:50 GMT
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Set-Cookie: alfredo.auth="u=alice&p=alice@LOCALHOST&t=kerberos&e=1343554310078&s=Qnfbj6410uHZBA8WZNBMwirpSxQ="; Version=1; Path=/
    Content-Type: application/json
    Transfer-Encoding: chunked
    Date: Sun, 29 Jul 2012 08:31:50 GMT
    
    {"delete":true}

Apache Hadoop 2.0.0 alpha(0.23.x後継)以降同梱(httpfs)

経路の暗号化(TLS/SSL)

  1. Hoopはプロキシですので、それ以外のクラスタへの経路を遮断し、Hoopまでの経路をセキュア(機密性)にすることにはセキュリティ上の有効性があります。
  2. HoopはすでにApache Tomcat上で動作していますので、Tomcat(Apache-Coyoteコネクタ)にTLS/SSLの設定を行うとよいでしょう。

リソース

  1. https://github.com/cloudera/hoop
  2. http://cloudera.github.com/hoop/docs/latest/index.html

添付ファイル: filehoop-0.1.0-SNAPSHOT-hadoop-1.0.patch 162件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-08-25 (土) 11:09:26 (2301d)