Hadoop2.0セットアップ >

note.pngDEPRECATED!: このバージョンのHadoopはすでに古いものです。ご利用は非推奨です。Hadoop2.1withSecurityセットアップをご参照ください。

これは、Apache Hadoopの2.0系最新版のセキュアセットアップ手順です。

目次

はじめに

  • このドキュメントでは、Hadoopのセキュア設定の方法を重点的に解説しています。セキュリティ以外の基本的な設定方法については、まずはHadoop2.0セットアップをご参照ください。
  • セキュアHadoopのアーキテクチャ概要については、HadoopWithSecurityをご参照ください。

他のバージョンのセットアップ

  1. Hadoop2.0.3alpha - DEPRECATED
  2. Hadoop2.0.2alpha - DEPRECATED
  3. Hadoop2.0.1alpha - DEPRECATED

セットアップ

Chefレシピ

参考までに、これらはここで説明している環境を構築するChefレシピ(ロール)です。ただし、Java、Kerberos、LDAPの一部およびビルドが必要なHadoopのバイナリについてのセットアップを除きます。

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed-with-security.rb
  • cake.pnggrid-chef-repo:/roles/hadoop-pleiades-with-security.rb
    • これらのロールで定義されているHadoopのデフォルトバージョンは(現時点で)安定版の1.x系ですので、以下の要領でロールを新たに定義して2.0.xのバージョンを指定して使用します。必要に応じて他の属性を設定します。
      1. name 'test-on-secure-env'
      2. description 'Testing on secure env.'
      3.  
      4. run_list(
      5.   'role[hadoop-pseudo-distributed-with-security]'
      6.   # or
      7.   #'role[hadoop-pleiades-with-security]'
      8. )
      9.  
      10. default_attributes(
      11.   'hadoop' => {
      12.     'version' => '2.0.4-alpha'
      13.   }
      14. )

Java

  1. Oracle(旧Sun)のJDKでは、後述のKerberos認証で強度の高いAES256暗号を利用するためには、強度が無制限のJCE管轄ポリシーファイルをインストールする必要があります。インストールにあたっては、Javaにおける高強度暗号の利用をご参照ください。※OpenJDKなどでは不要です。

Kerberos認証環境

  1. 基本的なKerberos AdminサーバおよびKDCの構築については、KerberosセットアップforHadoopをご参照ください。
  2. 検証目的の場合には、レルムは任意のもの(例えば、LOCALHOST、LOCALDOMAIN等)で構いません。

管理者のユーザプリンシパルの追加

  1. 管理者(hdfs、yarn、mapred)のユーザプリンシパルを追加しておきます。
    kadmin.local:  add_principal hdfs
    ...
    kadmin.local:  add_principal yarn
    ...
    kadmin.local:  add_principal mapred
    ...

疑似分散モード(シングルノード)に必要なプリンシパルの準備

  1. 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。チェックポイント機構のプロトコルには従来のKSSLではなく、推奨のSPNEGO/Kerberosを使用しますので、host/ プリンシパルの追加は不要です。
    $ sudo mkdir -p /grid/etc/keytabs/localhost
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey hdfs/localhost
    ...
    kadmin.local:  add_principal -randkey yarn/localhost
    ...
    kadmin.local:  add_principal -randkey mapred/localhost
    ...
    kadmin.local:  add_principal -randkey HTTP/localhost
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/localhost/localhost.keytab -glob */localhost
  2. keytabファイルの内容を確認し、適切なパーミッションを設定します。keytabファイルは一つで足りますが、Hadoopの設定に統一感が出るようにシンボリックリンクを張っておきます。
    $ sudo klist -e -k -t /grid/etc/keytabs/localhost/localhost.keytab
    Keytab name: FILE:/grid/etc/keytabs/localhost/localhost.keytab
    KVNO Timestamp        Principal
    ---- ---------------- ---------------------------------------------------------
       2 22/08/2012 21:33 yarn/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:33 yarn/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:22 yarn/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (arcfour-hmac) 
    
    $ cd /grid/etc/keytabs/localhost
    $ sudo chown root:hadoop localhost.keytab
    $ sudo chmod 440         localhost.keytab
    $ sudo ln -s localhost.keytab nn.keytab
    $ sudo ln -s localhost.keytab cn.keytab
    $ sudo ln -s localhost.keytab dn.keytab
    $ sudo ln -s localhost.keytab rm.keytab
    $ sudo ln -s localhost.keytab nm.keytab
    $ sudo ln -s localhost.keytab jh.keytab
    $ sudo ln -s localhost.keytab HTTP.keytab

完全分散モードに必要なサービスプリンシパルの準備

  1. 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。
    kadmin.local:  add_principal -randkey hdfs/pleiades-nn.grid.example.com
    WARNING: no policy specified for hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM; defaulting to no policy
    Principal "hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM" created.
    kadmin.local:  add_principal -randkey hdfs/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/pleiades-rm.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jh.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-nn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-rm.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-jh.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/dn00001.grid.example.com
    ...
    $ sudo mkdir -p /grid/etc/keytabs/pleiades
    $ sudo kadmin.local
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/nn.keytab -glob */pleiades-nn.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/cn.keytab -glob */pleiades-cn.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/rm.keytab -glob */pleiades-rm.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/jh.keytab -glob */pleiades-jh.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-dn.keytab -p hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-dn.keytab -p hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-nm.keytab -p yarn/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-nm.keytab -p yarn/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-HTTP.keytab -p HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-HTTP.keytab -p HTTP/dn00001.grid.example.com
    ...
  2. 各ノードに必要keytabファイルを配備します。DataNode/NodeManager?のkeytabファイルについては、設定の便宜のため配備後、ホスト名部分を削除した dn.keytabnm.keytabdn-HTTP.keytab にリネームします。keytabファイルの参照権限は、(LDAP認可環境セットアップ後に)各Hadoopデーモンプロセスの起動ユーザにのみ付与します。また、各ノードのSPNEGO用に HTTP/ プリンシパルを含むkeytabファイルに対して HTTP.keytab という名前でシンボリックリンクを張ります。
     *:$ cd /grid/etc/keytabs/pleiades
    nn:$ sudo chown hdfs:hdfs {nn,cn}.keytab
    nn:$ sudo chmod 400       {nn,cn}.keytab
    rm:$ sudo chown yarn:yarn rm.keytab
    rm:$ sudo chmod 400       rm.keytab
    dn:$ sudo chown hdfs:hdfs dn.keytab
    dn:$ sudo chmod 400       dn.keytab
    dn:$ sudo chown yarn:yarn nm.keytab
    dn:$ sudo chmod 400       nm.keytab
    dn:$ sudo chown yarn:hadoop dn-HTTP.keytab
    dn:$ sudo chmod 440         dn-HTTP.keytab    # for DataNode & NodeManager
    jh:$ sudo chown mapred:mapred jh.keytab
    jh:$ sudo chmod 400           jh.keytab
    
    # SPNEGO用プリンシパルのために各ノードで適当なkeytabにシンボリックリンクします
     *:$ sudo ln -s {{nn,cn,rm,jh},dn-HTTP}.keytab HTTP.keytab

LDAP認可環境

  1. 各ノードのOSレベル、Hadoopレベルでの権限認可(グループ解決)をすべてLDAPに委ねます。
  2. 構築方法の詳細については、LDAPセットアップforHadoopをご参照ください。
  3. Hadoop 2.0には hadoop.security.group.mapping に設定する GroupMappingServiceProvider? として LdapGroupsMapping? が追加されていますが、最終的にユーザ権限でTaskプロセスを起動させる関係上、権限解決はOSレベル(NSS)に統一して委譲するのが効果的です。そのような点で、後述の通り JniBasedUnixGroupsMapping? を使用するのが運用、パフォーマンス両面で最も効果的です。

セキュアHadoop基盤

  • テスト環境としてセットアップしやすいように、以下の例では主にKerberos認証環境の設定について疑似分散(シングルノード)の設定例を示しています。完全分散(Hadoop完全分散モデル環境)の設定は、XMLのコメントとして添えてありますのでご参照ください。
  • note.pngプリンシパルの設定に利用できる特殊変数 _HOST はコンテクストによってその置換規則が異なります。明示的な設定では柔軟に対応できない場合(例えば、dfs.web.authentication.kerberos.principal)がありますので、基本的には _HOST を使用して設定すべきです。
    • 原則的に、マスタノード(NameNodeResourceManager?)の場合にはサービスするDNS名で置換され、ワーカノード(DataNodeNodeManager?)の場合にはその hostname で置換されます。またマスタノードでサービスするDNS名は該当する各プロパティ(fs.defaultFS等)の値によって判断されますので注意が必要です(デフォルト設定ではなく明示的に設定する必要があります)。さらに、プロパティによってはバージョンによって _HOST の利用が未実装の場合(例えば、1.0.xおよび1.1.xのhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。
  1. ${HADOOP_PREFIX}/etc/hadoop/core-site.xml: this.* で始まるのプロパティは、設定を容易にするためのものです。
    1.     <property>
    2.         <name>this.cluster.name</name>
    3.         <value>localhost</value>
    4.         <!-- <value>pleiades</value> -->
    5.     </property>
    6.     <property>
    7.         <name>this.domain</name>
    8.         <value>localhost</value>
    9.         <!-- <value>grid.example.com</value> -->
    10.     </property>
    11.     <property>
    12.         <name>this.realm</name>
    13.         <value>LOCALDOMAIN</value>
    14.         <!-- <value>GRID.EXAMPLE.COM</value> -->
    15.     </property>
    16.     <property>
    17.         <name>this.keytab.dir</name>
    18.         <value>/grid/etc/keytabs/${this.cluster.name}</value>
    19.     </property>
    20.     <property>
    21.         <name>this.namenode.fqdn</name>
    22.         <value>localhost</value>
    23.         <!-- <value>${this.cluster.name}-nn.${this.domain}</value> -->
    24.     </property>
    25.  
    26.     <property>
    27.         <name>fs.defaultFS</name>
    28.         <value>hdfs://${this.namenode.fqdn}:9000/</value>
    29.     </property>
    30.     <property>
    31.         <name>hadoop.tmp.dir</name>
    32.         <value>/tmp/hadoop-${user.name}</value>
    33.     </property>
    34.  
    35.     <property>
    36.         <name>hadoop.security.authentication</name>
    37.         <value>kerberos</value>
    38.         <description>
    39.             Set the authentication for the cluster. Valid values are: simple or
    40.             kerberos.
    41.         </description>
    42.     </property>
    43.     <property>
    44.         <name>hadoop.security.authorization</name>
    45.         <value>true</value>
    46.         <description>
    47.             Enable authorization for different protocols.
    48.         </description>
    49.     </property>
    50. <!--
    51.     <property>
    52.         <name>hadoop.security.auth_to_local</name>
    53.         <value>
    54.             RULE:[2:$1@$0](.*@${this.realm})s/@.*//
    55.             RULE:[1:$1@$0](.*@${this.realm})s/@.*//
    56.             RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
    57.             RULE:[2:$1@$0](yarn@.*${this.realm})s/.*/yarn/
    58.             RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
    59.             DEFAULT
    60.         </value>
    61.     </property>
    62. -->
    63.     <property>
    64.         <name>hadoop.security.group.mapping</name>
    65.         <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    66.     </property>
    67. <!--
    68.     <property>
    69.         <name>hadoop.security.groups.cache.secs</name>
    70.         <value>14400</value>
    71.     </property>
    72.     <property>
    73.         <name>hadoop.kerberos.kinit.command</name>
    74.         <value>/usr/bin/kinit</value>
    75.     </property>
    76. -->
  2. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml
    1.     <property>
    2.         <name>this.secondary.namenode.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-cn.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>dfs.namenode.kerberos.principal</name>
    9.         <value>hdfs/_HOST@${this.realm}</value>
    10.         <!-- _HOST is replaced with the fs.defaultFS's host name -->
    11.         <!-- <value>hdfs/${this.namenode.fqdn}@${this.realm}</value> -->
    12.         <description>Kerberos principal name for the NameNode</description>
    13.     </property>
    14.     <property>
    15.         <name>dfs.namenode.keytab.file</name>
    16.         <value>${this.keytab.dir}/nn.keytab</value>
    17.         <description>
    18.             Combined keytab file containing the namenode service and host
    19.             principals.
    20.         </description>
    21.     </property>
    22.     <property>
    23.         <name>dfs.secondary.namenode.kerberos.principal</name>
    24.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    25.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    26.         <description>
    27.             Kerberos principal name for the secondary NameNode.
    28.         </description>
    29.     </property>
    30.     <property>
    31.         <name>dfs.secondary.namenode.keytab.file</name>
    32.         <value>${this.keytab.dir}/cn.keytab</value>
    33.         <description>
    34.             Combined keytab file containing the namenode service and host
    35.             principals.
    36.         </description>
    37.     </property>
    38.     <property>
    39.         <name>dfs.block.access.token.enable</name>
    40.         <value>true</value>
    41.         <description>
    42.             If "true", access tokens are used as capabilities for accessing
    43.             datanodes.
    44.             If "false", no access tokens are checked on accessing datanodes.
    45.         </description>
    46.     </property>
    47.     <property>
    48.         <name>dfs.datanode.kerberos.principal</name>
    49.         <value>hdfs/localhost@${this.realm}</value>
    50.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    51.         <description>
    52.             The Kerberos principal that the DataNode runs as. "_HOST" is
    53.             replaced by the real host name.
    54.         </description>
    55.     </property>
    56.     <property>
    57.         <name>dfs.datanode.keytab.file</name>
    58.         <value>${this.keytab.dir}/dn.keytab</value>
    59.         <description>
    60.             The filename of the keytab file for the DataNode.
    61.         </description>
    62.     </property>
    63.     <!-- (...) -->
    64.     <property>
    65.         <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    66.         <value>${dfs.web.authentication.kerberos.principal}</value>
    67.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    68.         <!-- _HOST is replaced with dfs.namenode.http-address's host name. -->
    69.     </property>
    70.     <property>
    71.         <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    72.         <value>${dfs.web.authentication.kerberos.principal}</value>
    73.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    74.         <!-- _HOST is replaced with dfs.namenode.secondary.http-address's host name. -->
    75.     </property>
    1. info.pngSPNEGO/Kerberos の追加と KSSL(Kerberized SSL、TLS/Kerberos)の非推奨化
      1. これまでHDFSのファイルシステムイメージの転送やfsckには通信プロトコルとしてKSSLが使用されてきましたが、JDK 6のバグ(6946669)によりKerberosチケットの暗号タイプに高強度のものを利用できないため、セキュリティの観点から代替プロトコルとしてSPNEGO/Kerberosが追加され、KSSLの利用は非推奨となりました(HDFS-2617)。
      2. Apache Hadoop では、実際に 1.1.02.0.2-alpha 以降で SPNEGO/Kerberos 対応が追加されており、それでも KSSL を利用したい場合には明示的にプロパティ hadoop.security.use-weak-http-crypto に true を設定する必要があります。
      3. この説明では、推奨の SPNEGO/Kerberos にてセットアップを行なっています。
  3. ${HADOOP_PREFIX}/etc/hadoop/yarn-site.xml
    1.     <property>
    2.         <name>this.resourcemanager.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-rm.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>yarn.acl.enable</name>
    9.         <value>true</value>
    10.     </property>
    11.     <property>
    12.         <name>yarn.admin.acl</name>
    13.         <value> yarn,gridops</value>
    14.     </property>
    15.     <property>
    16.         <name>yarn.resourcemanager.principal</name>
    17.         <value>yarn/${this.resourcemanager.fqdn}@${this.realm}</value>
    18.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    19.     </property>
    20.     <property>
    21.         <name>yarn.resourcemanager.keytab</name>
    22.         <value>${this.keytab.dir}/rm.keytab</value>
    23.     </property>
    24.     <property>
    25.         <name>yarn.nodemanager.principal</name>
    26.         <value>yarn/localhost@${this.realm}</value>
    27.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    28.     </property>
    29.     <property>
    30.         <name>yarn.nodemanager.keytab</name>
    31.         <value>${this.keytab.dir}/nm.keytab</value>
    32.     </property>
    33.     <property>
    34.         <name>yarn.nodemanager.admin-env</name>
    35.         <value>MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,LD_LIBRARY_PATH=${HADOOP_COMMON_HOME}/lib/native</value>
    36.     </property>
    1. ドキュメントでは、yarn.acl.enable のデフォルト値は false とありますが、実際には true です。しかしながら、明示的に true に設定しておきます。
    2. note.pngデフォルト設定では、ネイティブライブラリのロードに失敗し MRAppMaster? が起動できない場合がありますので、yarn.nodemanager.admin-env に環境変数 LD_LIBRARY_PATH の設定を追加しています(MAPREDUCE-4072も参照のこと)。
  4. ${HADOOP_PREFIX}/etc/hadoop/mapred-site.xml
    1.     <property>
    2.         <name>this.jobhistory.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-jh.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>mapreduce.jobhistory.principal</name>
    9.         <value>mapred/${this.jobhistory.fqdn}@${this.realm}</value>
    10.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    11.     </property>
    12.     <property>
    13.         <name>mapreduce.jobhistory.keytab</name>
    14.         <value>${this.keytab.dir}/jh.keytab</value>
    15.     </property>
  5. YARNではスケジューラが独立したため、キューの設定は ${HADOOP_PREFIX}/etc/hadoop/mapred-queues.xml ではなく、${HADOOP_PREFIX}/etc/hadoop/capacity-scheduler.xml のみで行います。詳細は後述のCapacityScheduler?のアクセス制御をご参照ください。
  6. ${HADOOP_PREFIX}/etc/hadoop/hadoop-policy.xml: note.png2.0.3aまで設定中の ${HADOOP_YARN_USER} が正しく展開されませんでしたが、2.0.4aでは修正されています(HADOOP-9444)ので、この設定ファイルの編集は必要ありません。

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. Hadoopには、jsvc が同梱されていないため、パッケージインストールします。
    $ sudo apt-get install jsvc
    1. note.pngディストリビューションによっては jsvc のバージョンが古くうまく動作しない場合があります。そのようなときには別途ビルドしてインストールする必要があります。Hadoop 2.0 では、CLASSPATHの設定にワイルドカードを使用しており、古い jsvc ではそれがうまく解決されません(例えば、debian.pngDebian squeeze)。
      1. Commons Daemonのネイティブ用ソースをダウンロードし、以下の要領でビルドし、適当な場所に生成された jsvc を配備します。
        $ tar xvzf commons-daemon-1.0.13-native-src.tar.gz
        $ cd commons-daemon-1.0.13-native-src/unix
        $ sh support/buildconf.sh
        support/buildconf.sh: configure script generated successfully
        $ export JAVA_HOME=/usr/lib/jvm/java-6-sun
        $ ./configure
        ...
        $ make
        ...
        $ sudo cp jsvc ${HADOOP_PREFIX}/sbin/
      2. 同じバージョンのCommons Daemonライブラリをダウンロードし、こちらも適当な場所に配備します。
        $ sudo tar xvzf commons-daemon-1.0.13-bin.tar.gz -C /grid/usr
  2. ${HADOOP_PREFIX}/etc/hadoop/hadoop-env.sh にセキュアDataNodeの設定を追加します。jsvc が依存する Commons Daemonライブラリについては、(同梱されているものではなく)先程インストールしたものを最初に参照するようにCLASSPATHを設定します。$JSVC_HOME については、jsvcコマンドが含まれるディレクトリを指定します。note.pngバグでしょうか、$HADOOP_SECURE_DN_(PID|LOG)_DIR より $HADOOP_(PID|LOG)_DIR の設定が優先されてしまいますので、とりあえずログディレクトリのみ hdfs/ ディレクトリ以下に出力されるようにしています。
    1. ...
    2. # Where log files are stored. $HADOOP_PREFIX/logs by default.
    3. #export HADOOP_LOG_DIR=/grid/vol/0/var/log/${USER}
    4. if [ x"$USER" = x'root' ]; then
    5.     export HADOOP_LOG_DIR=/grid/vol/0/var/log/hdfs
    6. else
    7.     export HADOOP_LOG_DIR=/grid/vol/0/var/log/${USER}
    8. fi
    9.  
    10. export HADOOP_SECURE_DN_USER=hdfs
    11. # This property is N/A or overridden by the HADOOP_PID_DIR
    12. #export HADOOP_SECURE_DN_PID_DIR=/grid/vol/0/var/run/${HADOOP_SECURE_DN_USER}
    13. # This property is N/A or overridden by the HADOOP_LOG_DIR
    14. #export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
    15. export JSVC_HOME=/usr/bin
    16. #export JSVC_HOME=/grid/usr/hadoop/sbin
    17. # Extra Java CLASSPATH elements.  Optional.
    18. if [ x"$HADOOP_CLASSPATH" = x ]; then
    19.     export HADOOP_CLASSPATH=/usr/share/java/commons-daemon.jar
    20.     #export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/grid/usr/commons-daemon-1.0.13/commons-daemon-1.0.13.jar
    21. else
    22.     # for Hive and HCatalog
    23.     export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/share/java/commons-daemon.jar
    24.     #export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/grid/usr/commons-daemon-1.0.13/commons-daemon-1.0.13.jar
    25. fi
    26. export HADOOP_USER_CLASSPATH_FIRST=true
    • 参考までに同梱されている Commons Daemon は以下の通り。
      $ ls share/hadoop/hdfs/lib/ | grep commons-daemon
      commons-daemon-1.0.3.jar
  3. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml
    1.     <property>
    2.         <name>dfs.datanode.address</name>
    3.         <value>0.0.0.0:1004</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.datanode.http.address</name>
    7.         <value>0.0.0.0:1006</value>
    8.     </property>
  4. hdfsユーザではなく、rootDataNodeを起動させます。起動後、デーモンのオーナはhdfsにスイッチされます。
    $ sudo sbin/hadoop-daemon.sh start datanode

ユーザ権限でのリソースコンテナ起動(tux.pngLinuxContainerExecutor?

  1. ソースパッケージをダウンロードし、環境に合わせて LinuxContainerExecutor? をビルドし配備します(info.pngビルド環境の構築については、Hadoopのビルドをご参照ください。)。ちなみに、バイナリパッケージに同梱されているのは前バージョンと異なりi386版の実行ファイルですので、x86_64環境の場合にはソースからのビルドが必須となります。
    1. ビルドに必要なMavenの3.x系とProtocolBuffersをあらかじめインストールしてからビルドします。note.pngver. 2.0.2aから追加で cmake が必要となっています。
      [for Debian] $ sudo apt-get install ant build-essential autoconf libtool cmake
      [for CentOS] $ sudo yum install     ant gcc-c++ make autoconf automake libtool cmake
      ...
      $ file ${HADOOP_PREFIX}/bin/container-executor
      /grid/usr/hadoop/bin/container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked
       (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0xe465062277e9ed1eba85c6a256ffb9aafa5a0cd4, not stripped
      $ file ${HADOOP_PREFIX}/bin/test-container-executor
      /grid/usr/hadoop/bin/test-container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically
       linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0x9cb6fa7a86a4015032742f3259a1bcf8b55472f1, not stripped
      ...
      $ tar xvzf hadoop-2.0.4-alpha-src.tar.gz
      $ cd hadoop-2.0.4-alpha-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/
      $ mvn package -Dcontainer-executor.conf.dir=/grid/usr/hadoop/etc/hadoop -DskipTests -Pnative
      ...
      $ file target/native/target/usr/local/bin/container-executor
      target/native/target/usr/local/bin/container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
       dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf294655498d16daf403f727f118eb02a2a6a1aeb,
       not stripped
      $ file target/native/target/usr/local/bin/test-container-executor
      target/native/target/usr/local/bin/test-container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
       dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xc13287f59fb04d57e7a725774f89b291542bee77,
       not stripped
    2. 生成された実行ファイルを適切な場所にコピーし、NodeManager?の起動ユーザのみが所属するグループ(yarn)についてsetgid属性を付与します。
      $ sudo mv ${HADOOP_PREFIX}/bin/container-executor      ${HADOOP_PREFIX}/bin/container-executor.dist
      $ sudo mv ${HADOOP_PREFIX}/bin/test-container-executor ${HADOOP_PREFIX}/bin/test-container-executor.dist
      $ sudo cp target/native/target/usr/local/bin/*container-executor ${HADOOP_PREFIX}/bin/
      $ cd ${HADOOP_PREFIX}
      $ sudo chown root:yarn bin/*container-executor
      $ sudo chmod 6050      bin/*container-executor
  2. LinuxContainerExecutor? の設定ファイル(${HADOOP_PREFIX}/etc/hadoop/container-executor.cfg)を ${HADOOP_PREFIX}/etc/hadoop/mapred-site.xml と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。yarn.nodemanager.(local|log)-dirs の設定はすでに不要のようです。
    1. #yarn.nodemanager.local-dirs=/grid/vol/0/var/lib/yarn/nm/local
    2. #yarn.nodemanager.log-dirs=/grid/vol/0/var/log/yarn/nm
    3. yarn.nodemanager.linux-container-executor.group=yarn
    4. #comma separated list of users who can not run applications
    5. banned.users=hfds,yarn,mapred,bin
    6. #Prevent other super-users
    7. #min.user.id=1000    # default
    $ sudo chown root:root etc/hadoop/container-executor.cfg 
    $ sudo chmod 0400      etc/hadoop/container-executor.cfg
    1. centos.pngCentOSでは一般ユーザのuidは通常500から振られるため、container-executor.cfgのmin.user.id の設定を500に引き下げることをお忘れなく。
      1. #min.user.id=1000    # default
      2. min.user.id=500    # for CentOS
  3. ${HADOOP_PREFIX}/etc/hadoop/yarn-site.xml の設定で、DefaultContainerExecutor? に替えて、LinuxContainerExecutor? を有効にします。(2.0.3aから追加された)リソース管理に cgroup(Control Group) を利用する場合には、以下のようにリソースハンドラに CgroupsLCEResourcesHandler? を設定し、必要に応じて関連するパラメータを調整します。info.pngなお、cgroup は、kernel-2.6.24以降(debian.pngDebian squeeze、centos.pngCentOS 6)で利用可能ですのでご注意ください。
    1.     <property>
    2.         <name>yarn.nodemanager.container-executor.class</name>
    3.         <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
    4.     </property>
    5.     <property>
    6.         <name>yarn.nodemanager.linux-container-executor.group</name>
    7.         <value>yarn</value>
    8.     </property>
    9.     <property>
    10.         <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>
    11.         <!--
    12.         <value>org.apache.hadoop.yarn.server.nodemanager.util.DefaultLCEResourcesHandler</value>
    13.          -->
    14.         <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>
    15.         <description>The class which should help the LCE handle resources.</description>
    16.     </property>
    17.     <!--
    18.     <property>
    19.         <name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>
    20.         <value>/hadoop-yarn</value>
    21.         <description>The cgroups hierarchy under which to place YARN proccesses (cannot contain commas).
    22.         If yarn.nodemanager.linux-container-executor.cgroups.mount is false (that is, if cgroups have
    23.         been pre-configured), then this cgroups hierarchy must already exist and be writable by the
    24.         NodeManager user, otherwise the NodeManager may fail.
    25.         Only used when the LCE resources handler is set to the CgroupsLCEResourcesHandler.</description>
    26.     </property>
    27.     <property>
    28.         <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
    29.         <value>false</value>
    30.         <description>Whether the LCE should attempt to mount cgroups if not found.
    31.         Only used when the LCE resources handler is set to the CgroupsLCEResourcesHandler.</description>
    32.     </property>
    33.     <property>
    34.         <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
    35.         <description>Where the LCE should attempt to mount cgroups if not found. Common locations
    36.         include /sys/fs/cgroup and /cgroup; the default location can vary depending on the Linux
    37.         distribution in use. This path must exist before the NodeManager is launched.
    38.         Only used when the LCE resources handler is set to the CgroupsLCEResourcesHandler, and
    39.         yarn.nodemanager.linux-container-executor.cgroups.mount is true.</description>
    40.     </property>
    41.     -->
    1. cgroup仮想ファイルシステムは設定によりYARNから動的にマウントさせることも可能ですが、それぞれのLinuxディストリビューションにあわせた方法で、あらかじめマウントし必要なリソース管理グループ(ディレクトリ)をセットアップしておくと間違いないでしょう。実装途上だとは思いますが、2.0.3a以降で利用するのはcpuサブシステムのみのようです。
      1. 以下は Ubuntu 12.10の例(マウントポイントは、/sys/fs/cgroup)ですが、相当するシェルコマンドで示しています。
        $ sudo mkdir /sys/fs/cgroup/cpu/hadoop-yarn
        $ sudo chown -R yarn:yarn /sys/fs/cgroup/cpu/hadoop-yarn
      2. Debian や CentOS であれば、cgconfig サービスを利用して、/etc/cgconfig.conf に以下のような設定を追加するとよいでしょう。
        1. group hadoop-yarn {
        2.     perm {
        3.         task {
        4.             uid = yarn;
        5.             gid = yarn;
        6.         }
        7.         admin {
        8.             uid = yarn;
        9.             gid = yarn;
        10.         }
        11.     }
        12.     cpu {
        13.     }
        14. }
      3. なお、ジョブ実行時には、以下の通りHadoopのリソースコンテナ毎にcgroupのリソース管理グループが作成されます。
        $ ls -l /sys/fs/cgroup/cpu/hadoop-yarn/
        total 0
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cgroup.clone_children
        --w--w--w- 1 yarn yarn 0 Feb 19 19:25 cgroup.event_control
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cgroup.procs
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000001
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000002
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000003
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000004
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000005
        drwxr-xr-x 2 yarn yarn 0 Feb 19 19:38 container_1361240603056_0004_01_000006
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.cfs_period_us
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.cfs_quota_us
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.rt_period_us
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.rt_runtime_us
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.shares
        -r--r--r-- 1 yarn yarn 0 Feb 19 19:25 cpu.stat
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 notify_on_release
        -rw-r--r-- 1 yarn yarn 0 Feb 19 19:25 tasks
    • note.pngはじめに DefaultContainerExecutor? を利用していた場合には、切り替え後に以下のようなパーミッションエラーが発生します。一度ユーザキャッシュディレクトリを削除する必要があります。
      1. 13/05/24 20:32:11 INFO mapreduce.Job: Job job_1369394783756_0001 failed with state FAILED due to: Application
      2.  application_1369394783756_0001 failed 1 times due to AM Container for appattempt_1369394783756_0001_000001 exited with
      3.   exitCode: -1000 due to: java.io.IOException: App initialization failed (255) with output: main : command provided 0
      4. main : user is alice
      5. Can't open appcache in /grid/vol/0/var/lib/yarn/nm/local/usercache/alice/appcache/application_1369394783756_0001 -
      6.  Permission denied
      7. Did not create any app directories
      8.  
      9. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(LinuxContainerExecutor.java:191)
      10. at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService$LocalizerRunner
      11. .run(ResourceLocalizationService.java:859)
      12. Caused by: org.apache.hadoop.util.Shell$ExitCodeException:
      13. at org.apache.hadoop.util.Shell.runCommand(Shell.java:202)
      14. at org.apache.hadoop.util.Shell.run(Shell.java:129)
      15. at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:322)
      16. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(LinuxContainerExecutor.java:183)
      17. ... 1 more
      18.  
      19. .Failing this attempt.. Failing the application.
      $ sudo rm -R /grid/vol/0/var/lib/yarn/nm/local/usercache
      # YARN を再起動します。

CapacityScheduler?のアクセス制御

  1. ${HADOOP_PREFIX}/etc/hadoop/capacity-scheduler.xml: CapacityScheduler?の設定を適切に行います。CapacityScheduler?には、新たにキューの階層化機能が追加されましたが、アクセス制御に関して言えば、親キューの権限が子のキューに継承される仕様の上、rootキューのデフォルト設定は全権付与(*)となっていますので、権限設定には十分注意する必要があります(上位階層で緩和した権限を下位のキューで制限することはできません)。通常、rootキューの権限設定を最小限に絞った上で、子のキューの権限を適切に緩和する必要があります。設定値のフォーマットは、カンマ区切りの許可ユーザリストと許可グループリストをさらに半角スペースで区切ります。半角スペース一つのみは、ユーザリスト、グループリスト何れも設定しないという意味で、どのユーザにもその権限を許可しないことを表します。
    1.   <property>
    2.     <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
    3.     <value> </value>
    4.     <description>
    5.       The ACL of who can submit jobs to the root queue.
    6.     </description>
    7.   </property>
    8.   <property>
    9.     <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
    10.     <value> hadoop,gridops</value>
    11.     <description>
    12.       The ACL of who can administer jobs on the root queue.
    13.     </description>
    14.   </property>
    15.   <!-- (...) -->
    16.   <property>
    17.     <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    18.     <value>*</value>
    19.     <description>
    20.       The ACL of who can submit jobs to the default queue.
    21.     </description>
    22.   </property>
    23.   <property>
    24.     <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    25.     <value> hadoop,gridops</value>
    26.     <description>
    27.       The ACL of who can administer jobs on the default queue.
    28.     </description>
    29.   </property>
  2. デーモンがすでに起動済であれば、以下のコマンドで設定内容を反映させることができます。
    $ sudo -u yarn ${HADOOP_PREFIX}/bin/yarn rmadmin -refreshQueues
  3. 各ユーザは、以下のコマンドで自分に付与されている権限を確認することができます。
    $ sudo -u yarn ${HADOOP_PREFIX}/bin/mapred queue -showacls
    ...
    Queue acls for user :  yarn
    
    Queue  Operations
    =====================
    root  ADMINISTER_QUEUE
    default  ADMINISTER_QUEUE,SUBMIT_APPLICATIONS
    $ sudo -u alice ${HADOOP_PREFIX}/bin/mapred queue -showacls
    ...
    Queue acls for user :  alice
    
    Queue  Operations
    =====================
    root  
    default  SUBMIT_APPLICATIONS

ProxyUser(Secure Impersonation)の設定

  • ProxyUserの許可設定については、それを必要とするOozieHoopのセットアップドキュメントをご参照ください。

WebコンソールのSPNEGO/Kerberos設定

  • 各HadoopサービスのWebコンソールにもKerberos認証によるシングルサインオンでアクセスするため、SPNEGO/Kerberosの設定を行います。
  1. まず署名のためのシークレットファイルを用意し、パーミッションを適切に設定します。完全分散の場合には、各ノードに同じシークレットファイルを配備します。
    $ sudo chmod 640 /grid/etc/hadoop-http-auth-signature-secret 
    $ sudo chown root:hadoop /grid/etc/hadoop-http-auth-signature-secret
  2. ${HADOOP_PREFIX}/etc/hadoop/core-site.xml を編集します。hadoop.http.filter.initializers プロパティに org.apache.hadoop.security.AuthenticationFilterInitializer? を設定し、hadoop.http.authentication.typekerberos にします。note.pngただし、同一ノードで複数のデーモンを起動させる疑似分散環境では、dfs.web.authentication.kerberos.principal 等の値が同一となるため、Web UI等へのリクエストがリプレイ攻撃*1と判断されてしまいます。そのような場合には、やむを得ませんので hadoop.http.authentication.type を simple に設定して動作確認するとよいでしょう。
    1.     <property>
    2.         <name>hadoop.http.filter.initializers</name>
    3.         <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
    4.         <!-- <value>org.apache.hadoop.http.lib.StaticUserWebFilter</value> -->
    5.         <description>The name of a class that initializes an input filter for Jetty.
    6.             This filter will always return Dr.Who as the web user when the servlets
    7.             query for the authenticated user </description>
    8.     </property>
    9.     <property>
    10.         <name>hadoop.http.authentication.signature.secret.file</name>
    11.         <value>/grid/etc/hadoop-http-auth-signature-secret</value>
    12.     </property>
    13.     <property>
    14.         <name>hadoop.http.authentication.cookie.domain</name>
    15.         <value>${this.domain}</value>
    16.     </property>
    17.     <property>
    18.         <name>hadoop.http.authentication.type</name>
    19.         <value>kerberos</value>
    20.         <description>Defines authentication used for the HTTP web-consoles.
    21.             The supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#.
    22.             The dfeault value is simple.</description>
    23.     </property>
    24.     <property>
    25.         <name>hadoop.http.authentication.kerberos.principal</name>
    26.         <value>HTTP/localhost@${this.realm}</value>
    27.         <!-- <value>HTTP/_HOST@${this.realm}</value>
    28.             _HOST N/A!: v1.0, v1.1, HDP1.2; OK: v2.0, CDH3, CDH4 -->
    29.     </property>
    30.     <property>
    31.         <name>hadoop.http.authentication.kerberos.keytab</name>
    32.         <value>${this.keytab.dir}/HTTP.keytab</value>
    33.     </property>
  3. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml: HDFSのWebコンソールで使用するプリンシパルを設定します。
    1.     <property>
    2.         <name>dfs.namenode.http-address</name>
    3.         <value>${this.namenode.fqdn}:50070</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.namenode.secondary.http-address</name>
    7.         <value>${this.secondary.namenode.fqdn}:50090</value>
    8.     </property>
    9.     <property>
    10.         <name>dfs.web.authentication.kerberos.principal</name>
    11.         <value>HTTP/_HOST@${this.realm}</value>
    12.     </property>
    13.     <property>
    14.         <name>dfs.web.authentication.kerberos.keytab</name>
    15.         <value>${this.keytab.dir}/HTTP.keytab</value>
    16.     </property>
  4. 編集後、各デーモンプロセスを再起動し反映させます。
  5. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS
  2. WebHDFS

テスト

  1. ACL設定を追加して実行します。
    $ sudo -u alice kinit
    Password for alice@LOCALDOMAIN: 
    $ sudo -u alice bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.0.4-alpha.jar pi \
    > -D mapreduce.job.acl-view-job=* -D mapreduce.job.acl-modify-job=alice 5 10

参考リソース

  1. 設定ファイル一式
  2. Hadoop MapReduce Next Generation - Cluster Setup
  3. CDH4 Security Guide

*1 Step 4: Create and Deploy the Kerberos Principals and Keytab Files

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