Hadoop2.0セットアップ >

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

目次

はじめに

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

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

  1. Hadoop2.0.1alpha - DEPRECATED

セットアップ

Java

  1. Sun(現Oracle)の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ファイルを作成します。
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey hdfs/localhost
    ...
    kadmin.local:  add_principal -randkey host/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.keytab -glob */localhost
  2. keytabファイルの内容を確認し、適切なパーミッションを設定します。
    $ sudo klist -e -k -t /grid/etc/keytabs/localhost.keytab
    Keytab name: FILE:/grid/etc/keytabs/localhost.keytab
    KVNO Timestamp        Principal
    ---- ---------------- ---------------------------------------------------------
       2 22/08/2012 21:33 yarn/localhost@GRID.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:33 yarn/localhost@GRID.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:22 yarn/localhost@GRID.EXAMPLE.COM (arcfour-hmac) 
       2 22/08/2012 21:35 hdfs/localhost@GRID.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@GRID.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@GRID.EXAMPLE.COM (arcfour-hmac) 
       2 22/08/2012 21:36 host/localhost@GRID.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 host/localhost@GRID.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 host/localhost@GRID.EXAMPLE.COM (arcfour-hmac) 
       2 22/08/2012 21:36 mapred/localhost@GRID.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@GRID.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@GRID.EXAMPLE.COM (arcfour-hmac) 
       2 22/08/2012 21:38 HTTP/localhost@GRID.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@GRID.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@GRID.EXAMPLE.COM (arcfour-hmac) 
    
    $ sudo chown root:hadoop /grid/etc/keytabs/localhost.keytab
    $ sudo chmod 440 /grid/etc/keytabs/localhost.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 host/pleiades-nn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-nn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey host/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/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 HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jh.grid.example.com
    ...
    $ sudo mkdir -p /grid/etc/keytabs
    $ 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/dn00000-dn.keytab -p hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/dn00001-dn.keytab -p hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/dn00000-nm.keytab -p yarn/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/dn00001-nm.keytab -p yarn/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/dn00000-web.keytab -p HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/dn00001-web.keytab -p HTTP/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades-jh.keytab -p mapred/pleiades-jh.grid.example.com
  2. 各ノードに必要keytabファイルを配備します。DataNode/NodeManager?のkeytabファイルについては、設定の便宜のため配備後、ホスト名部分を削除した dn.keytab、nm.keytab、web.keytab にリネームします。keytabファイルの参照権限は、(LDAP認可環境セットアップ後に)各Hadoopデーモンプロセスの起動ユーザにのみ付与します。
    nn:$ sudo chown hdfs:hdfs /grid/etc/keytabs/pleiades-nn.keytab
    nn:$ sudo chmod 400 /grid/etc/keytabs/pleiades-nn.keytab
    nn:$ sudo chown hdfs:hdfs /grid/etc/keytabs/pleiades-cn.keytab
    nn:$ sudo chmod 400 /grid/etc/keytabs/pleiades-cn.keytab
    rm:$ sudo chown yarn:yarn /grid/etc/keytabs/pleiades-rm.keytab
    rm:$ sudo chmod 400 /grid/etc/keytabs/pleiades-rm.keytab
    dn:$ sudo chown hdfs:hdfs /grid/etc/keytabs/dn.keytab
    dn:$ sudo chmod 400 /grid/etc/keytabs/dn.keytab
    dn:$ sudo chown yarn:yarn /grid/etc/keytabs/nm.keytab
    dn:$ sudo chmod 400 /grid/etc/keytabs/nm.keytab
    dn:$ sudo chown yarn:yarn /grid/etc/keytabs/web.keytab
    dn:$ sudo chmod 400 /grid/etc/keytabs/web.keytab
    jh:$ sudo chown mapred:mapred /grid/etc/keytabs/pleiades-jh.keytab
    jh:$ sudo chmod 400 /grid/etc/keytabs/pleiades-jh.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のコメントとして添えてありますのでご参照ください。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。
  1. ${HADOOP_PREFIX}/etc/hadoop/core-site.xml: this.* で始まるのプロパティは、設定を容易にするためのものです。
    1.     <!--
    2.     <property>
    3.         <name>this.cluster.name</name>
    4.         <value>pleiades</value>
    5.     </property>
    6.     <property>
    7.         <name>this.domain</name>
    8.         <value>grid.example.com</value>
    9.     </property>
    10.     -->
    11.     <property>
    12.         <name>this.realm</name>
    13.         <value>LOCALHOST</value>
    14.         <!-- <value>GRID.EXAMPLE.COM</value> -->
    15.     </property>
    16.     <property>
    17.         <name>this.keytab.dir</name>
    18.         <value>/grid/etc/keytabs</value>
    19.     </property>
    20.  
    21.     <property>
    22.         <name>fs.defaultFS</name>
    23.         <value>hdfs://localhost:9000/</value>
    24.     </property>
    25.     <property>
    26.         <name>hadoop.tmp.dir</name>
    27.         <value>/tmp/hadoop-${user.name}</value>
    28.     </property>
    29.  
    30.     <property>
    31.         <name>hadoop.security.authentication</name>
    32.         <value>kerberos</value>
    33.         <description>
    34.             Set the authentication for the cluster. Valid values are: simple or
    35.             kerberos.
    36.         </description>
    37.     </property>
    38.     <property>
    39.         <name>hadoop.security.authorization</name>
    40.         <value>true</value>
    41.         <description>
    42.             Enable authorization for different protocols.
    43.         </description>
    44.     </property>
    45. <!--
    46.     <property>
    47.         <name>hadoop.security.auth_to_local</name>
    48.         <value>
    49.             RULE:[2:$1@$0](.*@${this.realm})s/@.*//
    50.             RULE:[1:$1@$0](.*@${this.realm})s/@.*//
    51.             RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
    52.             RULE:[2:$1@$0](yarn@.*${this.realm})s/.*/yarn/
    53.             RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
    54.             DEFAULT
    55.         </value>
    56.     </property>
    57. -->
    58.     <property>
    59.         <name>hadoop.security.group.mapping</name>
    60.         <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    61.     </property>
    62. <!--
    63.     <property>
    64.         <name>hadoop.security.groups.cache.secs</name>
    65.         <value>14400</value>
    66.     </property>
    67.     <property>
    68.         <name>hadoop.kerberos.kinit.command</name>
    69.         <value>/usr/bin/kinit</value>
    70.     </property>
    71. -->
  2. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml
    1.     <property>
    2.         <name>dfs.namenode.kerberos.principal</name>
    3.         <value>hdfs/localhost@${this.realm}</value>
    4.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    5.         <!-- <value>hdfs/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    6.         <description>Kerberos principal name for the NameNode</description>
    7.     </property>
    8.     <property>
    9.         <name>dfs.namenode.kerberos.https.principal</name>
    10.         <value>host/localhost@${this.realm}</value>
    11.         <!-- <value>host/_HOST@${this.realm}</value> -->
    12.         <!-- <value>host/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    13.         <description>
    14.             The Kerberos principal for the host that the NameNode runs on.
    15.         </description>
    16.     </property>
    17.     <property>
    18.         <name>dfs.namenode.keytab.file</name>
    19.         <value>${this.keytab.dir}/localhost.keytab</value>
    20.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-nn.keytab</value> -->
    21.         <description>
    22.             Combined keytab file containing the namenode service and host
    23.             principals.
    24.         </description>
    25.     </property>
    26.     <property>
    27.         <name>dfs.namenode.secondary.kerberos.principal</name>
    28.         <value>hdfs/localhost@${this.realm}</value>
    29.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    30.         <!-- <value>hdfs/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
    31.         <description>
    32.             Kerberos principal name for the secondary NameNode.
    33.         </description>
    34.     </property>
    35.     <property>
    36.         <name>dfs.namenode.secondary.kerberos.https.principal</name>
    37.         <value>host/localhost@${this.realm}</value>
    38.         <!-- <value>host/_HOST@${this.realm}</value> -->
    39.         <!-- <value>host/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
    40.         <description>
    41.             The Kerberos principal for the host that the secondary NameNode
    42.             runs on.
    43.         </description>
    44.     </property>
    45.     <property>
    46.         <name>dfs.namenode.secondary.keytab.file</name>
    47.         <value>${this.keytab.dir}/localhost.keytab</value>
    48.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-cn.keytab</value> -->
    49.         <description>
    50.             Combined keytab file containing the namenode service and host
    51.             principals.
    52.         </description>
    53.     </property>
    54.     <property>
    55.         <name>dfs.block.access.token.enable</name>
    56.         <value>true</value>
    57.         <description>
    58.             If "true", access tokens are used as capabilities for accessing
    59.             datanodes.
    60.             If "false", no access tokens are checked on accessing datanodes.
    61.         </description>
    62.     </property>
    63.     <property>
    64.         <name>dfs.datanode.kerberos.principal</name>
    65.         <value>hdfs/localhost@${this.realm}</value>
    66.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    67.         <description>
    68.             The Kerberos principal that the DataNode runs as. "_HOST" is
    69.             replaced by the real host name.
    70.         </description>
    71.     </property>
    72.     <property>
    73.         <name>dfs.datanode.keytab.file</name>
    74.         <value>${this.keytab.dir}/localhost.keytab</value>
    75.         <!-- <value>${this.keytab.dir}/dn.keytab</value> -->
    76.         <description>
    77.             The filename of the keytab file for the DataNode.
    78.         </description>
    79.     </property>
  3. ${HADOOP_PREFIX}/etc/hadoop/yarn-site.xml
    1.     <property>
    2.         <name>yarn.resourcemanager.principal</name>
    3.         <value>yarn/localhost@${this.realm}</value>
    4.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    5.         <!-- <value>yarn/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    6.     </property>
    7.     <property>
    8.         <name>yarn.resourcemanager.keytab</name>
    9.         <value>${this.keytab.dir}/localhost.keytab</value>
    10.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-rm.keytab</value> -->
    11.     </property>
    12.     <property>
    13.         <name>yarn.nodemanager.principal</name>
    14.         <value>yarn/localhost@${this.realm}</value>
    15.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    16.     </property>
    17.     <property>
    18.         <name>yarn.nodemanager.keytab</name>
    19.         <value>${this.keytab.dir}/localhost.keytab</value>
    20.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-nm.keytab</value> -->
    21.     </property>
    22.     <property>
    23.         <name>yarn.nodemanager.admin-env</name>
    24.         <value>MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,LD_LIBRARY_PATH=${HADOOP_COMMON_HOME}/lib/native</value>
    25.     </property>
    1. note.pngデフォルト設定では、ネイティブライブラリのロードに失敗し MRAppMaster? が起動できない場合がありますので、yarn.nodemanager.admin-env に環境変数 LD_LIBRARY_PATH の設定を追加しています(MAPREDUCE-4072も参照のこと)。
  4. ${HADOOP_PREFIX}/etc/hadoop/mapred-site.xml
    1.     <property>
    2.         <name>mapreduce.jobhistory.principal</name>
    3.         <value>mapred/localhost@${this.realm}</value>
    4.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    5.         <!-- <value>mapred/${this.cluster.name}-jh.${this.domain}@${this.realm}</value> -->
    6.     </property>
    7.     <property>
    8.         <name>mapreduce.jobhistory.keytab</name>
    9.         <value>${this.keytab.dir}/localhost.keytab</value>
    10.         <!-- <value>${this.keytab.dir}/${this.cluster.name}-jh.keytab</value> -->
    11.     </property>
  5. ${HADOOP_PREFIX}/etc/hadoop/mapred-queue-acls.xml: defaultキューのジョブ実行権限と管理権限を設定します。
    $ sudo cp share/hadoop/common/templates/conf/mapred-queue-acls.xml etc/hadoop/
    1. <property>
    2.   <name>mapred.queue.default.acl-submit-job</name>
    3.   <value>*</value>
    4.   <description> Comma separated list of user and group names that are allowed
    5.     to submit jobs to the 'default' queue. The user list and the group list
    6.     are separated by a blank. For e.g. user1,user2 group1,group2.
    7.     If set to the special value '*', it means all users are allowed to
    8.     submit jobs. If set to ' '(i.e. space), no user will be allowed to submit
    9.     jobs.
    10.  
    11.     It is only used if authorization is enabled in Map/Reduce by setting the
    12.     configuration property mapred.acls.enabled to true.
    13.  
    14.     Irrespective of this ACL configuration, the user who started the cluster and
    15.     cluster administrators configured via
    16.     mapreduce.cluster.administrators can submit jobs.
    17.   </description>
    18. </property>
    19. <property>
    20.   <name>mapred.queue.default.acl-administer-jobs</name>
    21.   <value> hadoop,gridops</value>
    22.   <!-- <value>*</value> -->
    23.   <description> Comma separated list of user and group names that are allowed
    24.     to view job details, kill jobs or modify job's priority for all the jobs
    25.     in the 'default' queue. The user list and the group list
    26.     are separated by a blank. For e.g. user1,user2 group1,group2.
    27.     If set to the special value '*', it means all users are allowed to do
    28.     this operation. If set to ' '(i.e. space), no user will be allowed to do
    29.     this operation.
    30.  
    31.     It is only used if authorization is enabled in Map/Reduce by setting the
    32.     configuration property mapred.acls.enabled to true.
    33.  
    34.     Irrespective of this ACL configuration, the user who started the cluster and
    35.     cluster administrators configured via
    36.     mapreduce.cluster.administrators can do the above operations on all the jobs
    37.     in all the queues. The job owner can do all the above operations on his/her
    38.     job irrespective of this ACL configuration.
    39.   </description>
    40. </property>
  6. ${HADOOP_PREFIX}/etc/hadoop/hadoop-policy.xml: note.pngテンプレートをコピーして設定しますが、${HADOOP_YARN_USER}がうまく展開されないようですので、その部分のみリテラルで指定します。
    $ sudo cp share/hadoop/common/templates/conf/hadoop-policy.xml etc/hadoop/
    1. $ diff -u share/hadoop/common/templates/conf/hadoop-policy.xml etc/hadoop/hadoop-policy.xml
    2. --- share/hadoop/common/templates/conf/hadoop-policy.xml 2012-10-02 09:51:54.000000000 +0900
    3. +++ etc/hadoop/hadoop-policy.xml 2012-11-01 19:29:37.675239819 +0900
    4. @@ -132,7 +132,7 @@
    5.  
    6.    <property>
    7.      <name>security.resourcetracker.protocol.acl</name>
    8. -    <value>${HADOOP_YARN_USER}</value>
    9. +    <value>yarn</value>
    10.      <description>ACL for ResourceTracker protocol, used by the
    11.      ResourceManager and NodeManager to communicate with each other.
    12.      The ACL is a comma-separated list of user and group names. The user and
    13. @@ -142,7 +142,7 @@
    14.  
    15.    <property>
    16.      <name>security.admin.protocol.acl</name>
    17. -    <value>${HADOOP_YARN_USER}</value>
    18. +    <value>yarn</value>
    19.      <description>ACL for RMAdminProtocol, for admin commands.
    20.      The ACL is a comma-separated list of user and group names. The user and
    21.      group list is separated by a blank. For e.g. "alice,bob users,wheel".

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. Hadoopには、jsvc が同梱されていないため、パッケージインストールします。
    $ sudo apt-get install jsvc
  2. ${HADOOP_PREFIX}/etc/hadoop/hadoop-env.sh にセキュアDataNodeの設定を追加します。jsvc が依存する Commons Daemonライブラリについては、(同梱されているものではなく)先程パッケージインストールしたものを最初に参照するようにCLASSPATHを設定します。$JSVC_HOME については、jsvcコマンドが含まれるディレクトリを指定します。
    1. export HADOOP_SECURE_DN_USER=hdfs
    2. export HADOOP_SECURE_DN_PID_DIR=/grid/vol/0/var/run/${HADOOP_SECURE_DN_USER}
    3. export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
    4. export JSVC_HOME=/usr/bin
    5. # Extra Java CLASSPATH elements.  Optional.
    6. if [ x"$HADOOP_CLASSPATH" = x ]; then
    7.     export HADOOP_CLASSPATH=/usr/share/java/commons-daemon.jar
    8. else
    9.     # for Hive and HCatalog
    10.     export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/share/java/commons-daemon.jar
    11. fi
    12. export HADOOP_USER_CLASSPATH_FIRST=true
  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? をビルドし配備します。ちなみに、バイナリパッケージに同梱されているのは前バージョンと異なり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 autoconf automake libtool cmake
      ...
      $ file ${HADOOP_PREFIX}/bin/container-executor 
      bin/container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs)
      , for GNU/Linux 2.6.9, not stripped
      $ file ${HADOOP_PREFIX}/test-container-executor 
      test-container-executor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs)
      , for GNU/Linux 2.6.9, not stripped
      ...
      $ tar xvzf hadoop-2.0.2-alpha-src.tar.gz
      $ cd hadoop-2.0.2-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]=0x5c82d7e93fe48e2ab0b26c94580127fc8c5a1250,
       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]=0xe611b778b4b3aa29594058f543016b413eeaf62e,
       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の読取専用)を設定します。
    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 の設定で、LinuxContainerExecutor? を有効にします。
    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>
    • note.pngはじめに DefaultContainerExecutor? を利用していた場合には、切り替え後に以下のようなパーミッションエラーが発生します。一度ユーザキャッシュディレクトリを削除する必要があります。
      1. 12/10/30 19:18:24 INFO mapreduce.Job: Job job_1351570571119_0001 failed with state FAILED due to: Application
      2.  application_1351570571119_0001 failed 1 times due to AM Container for appattempt_1351570571119_0001_000001 exited
      3.  with  exitCode: -1000 due to: java.io.IOException: App initialization failed (255) with output: main : command
      4.  provided 0
      5. main : user is alice
      6. Can't open appcache in /grid/vol/0/var/lib/yarn/nm/local/usercache/alice/appcache/application_1351570571119_0001 -
      7.  Permission denied
      8. Did not create any app directories
      9.  
      10. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
      11. LinuxContainerExecutor.java:178)
      12. at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer
      13. .ResourceLocalizationService$LocalizerRunner.run(ResourceLocalizationService.java:864)
      14. Caused by: org.apache.hadoop.util.Shell$ExitCodeException:
      15. at org.apache.hadoop.util.Shell.runCommand(Shell.java:202)
      16. at org.apache.hadoop.util.Shell.run(Shell.java:129)
      17. at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:322)
      18. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
      19. LinuxContainerExecutor.java:170)
      20. ... 1 more
      21.  
      22. .Failing this attempt.. Failing the application.
      $ sudo rm -R /grid/vol/0/var/lib/yarn/nm/local/usercache
      # YARN を再起動します。

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 にします。
    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>localhost</value>
    16.         <!-- <value>grid.example.com</value> -->
    17.     </property>
    18.     <property>
    19.         <name>hadoop.http.authentication.type</name>
    20.         <value>kerberos</value>
    21.         <description>Defines authentication used for the HTTP web-consoles.
    22.             The supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#.
    23.             The dfeault value is simple.</description>
    24.     </property>
    25.     <property>
    26.         <name>hadoop.http.authentication.kerberos.principal</name>
    27.         <value>HTTP/localhost@${this.realm}</value>
    28.     </property>
    29.     <property>
    30.         <name>hadoop.http.authentication.kerberos.keytab</name>
    31.         <value>${this.keytab.dir}/localhost.keytab</value>
    32.     </property>
  3. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml: HDFSのWebコンソールで使用するプリンシパルを設定します。
    1.     <property>
    2.         <name>dfs.web.authentication.kerberos.principal</name>
    3.         <value>HTTP/localhost@${this.realm}</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.web.authentication.kerberos.keytab</name>
    7.         <value>${this.keytab.dir}/localhost.keytab</value>
    8.         <!-- <value>${this.keytab.dir}/web.keytab</value> -->
    9.     </property>
    10.     <property>
    11.         <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    12.         <value>${dfs.web.authentication.kerberos.principal}</value>
    13.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    14.         <!-- <value>HTTP/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    15.     </property>
    16.     <property>
    17.         <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    18.         <value>${dfs.web.authentication.kerberos.principal}</value>
    19.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    20.         <!-- <value>HTTP/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
    21.     </property>
  4. 編集後、各デーモンプロセスを再起動し反映させます。
  5. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS
  2. WebHDFS

テスト

  1. ACL設定を追加して実行します。
    $ sudo -u alice kinit
    Password for alice@LOCALHOST: 
    $ sudo -u alice bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.0.2-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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-03-06 (水) 20:00:51 (3156d)