[[Hadoop2.0セットアップ]] >

&ref(images/note.png,nolink);&color(red){''DEPRECATED!: このバージョンのHadoopは古いです。ご利用は非推奨です。''};[[Hadoop2.0withSecurityセットアップ]]をご参照ください。

* 目次 [#p9e633f8]
#contents

* はじめに [#id9b2f7d]

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

* セットアップ [#se9098f7]

** Java [#v57bcf4d]

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

** Kerberos認証環境 [#u0f90315]

+ 基本的なKerberos AdminサーバおよびKDCの構築については、[[KerberosセットアップforHadoop]]をご参照ください。

*** 管理者のユーザプリンシパルの追加 [#h5d2337e]

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

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

+ 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。
#geshi(){{
$ 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
}}
+ keytabファイルの内容を確認し、適切なパーミッションを設定します。
#geshi(){{
$ 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
}}

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

- 例示環境の詳細については、[[Hadoop完全分散モデル環境]]をご参照ください。
+ 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。
#geshi{{
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
...
}}
#geshi{{
$ 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
}}
+ 各ノードに必要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認可環境 [#o01f1239]

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

** セキュアHadoop基盤 [#va415ac5]

- テスト環境としてセットアップしやすいように、以下の例では主にKerberos認証環境の設定について疑似分散(シングルノード)の設定例を示しています。完全分散([[Hadoop完全分散モデル環境]])の設定は、XMLのコメントとして添えてありますのでご参照ください。
- すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。

+ ${HADOOP_PREFIX}/etc/hadoop/''core-site.xml'': ''this.*'' で始まるのプロパティは、設定を容易にするためのものです。
#geshi(xml,number){{
    <!--
    <property>
        <name>this.cluster.name</name>
        <value>pleiades</value>
    </property>
    <property>
        <name>this.domain</name>
        <value>grid.example.com</value>
    </property>
    -->
    <property>
        <name>this.realm</name>
        <value>LOCALHOST</value>
        <!-- <value>GRID.EXAMPLE.COM</value> -->
    </property>
    <property>
        <name>this.keytab.dir</name>
        <value>/grid/etc/keytabs</value>
    </property>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000/</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop-${user.name}</value>
    </property>

    <property>
        <name>hadoop.security.authentication</name>
        <value>kerberos</value>
        <description>
            Set the authentication for the cluster. Valid values are: simple or
            kerberos.
        </description>
    </property>
    <property>
        <name>hadoop.security.authorization</name>
        <value>true</value>
        <description>
            Enable authorization for different protocols.
        </description>
    </property>
<!--
    <property>
        <name>hadoop.security.auth_to_local</name>
        <value>
            RULE:[2:$1@$0](.*@${this.realm})s/@.*//
            RULE:[1:$1@$0](.*@${this.realm})s/@.*//
            RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
            RULE:[2:$1@$0](yarn@.*${this.realm})s/.*/yarn/
            RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
            DEFAULT
        </value>
    </property>
-->
    <property>
        <name>hadoop.security.group.mapping</name>
        <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    </property>
<!--
    <property>
        <name>hadoop.security.groups.cache.secs</name>
        <value>14400</value>
    </property>
    <property>
        <name>hadoop.kerberos.kinit.command</name>
        <value>/usr/bin/kinit</value>
    </property>
-->
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''hdfs-site.xml''
#geshi(xml,number){{
    <property>
        <name>dfs.namenode.kerberos.principal</name>
        <value>hdfs/localhost@${this.realm}</value>
        <!-- <value>hdfs/_HOST@${this.realm}</value> -->
        <!-- <value>hdfs/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
        <description>Kerberos principal name for the NameNode</description>
    </property>
    <property>
        <name>dfs.namenode.kerberos.https.principal</name>
        <value>host/localhost@${this.realm}</value>
        <!-- <value>host/_HOST@${this.realm}</value> -->
        <!-- <value>host/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
        <description>
            The Kerberos principal for the host that the NameNode runs on.
        </description>
    </property>
    <property>
        <name>dfs.namenode.keytab.file</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/${this.cluster.name}-nn.keytab</value> -->
        <description>
            Combined keytab file containing the namenode service and host
            principals.
        </description>
    </property>
    <property>
        <name>dfs.namenode.secondary.kerberos.principal</name>
        <value>hdfs/localhost@${this.realm}</value>
        <!-- <value>hdfs/_HOST@${this.realm}</value> -->
        <!-- <value>hdfs/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
        <description>
            Kerberos principal name for the secondary NameNode.
        </description>
    </property>
    <property>
        <name>dfs.namenode.secondary.kerberos.https.principal</name>
        <value>host/localhost@${this.realm}</value>
        <!-- <value>host/_HOST@${this.realm}</value> -->
        <!-- <value>host/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
        <description>
            The Kerberos principal for the host that the secondary NameNode
            runs on.
        </description>
    </property>
    <property>
        <name>dfs.namenode.secondary.keytab.file</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/${this.cluster.name}-cn.keytab</value> -->
        <description>
            Combined keytab file containing the namenode service and host
            principals.
        </description>
    </property>
    <property>
        <name>dfs.block.access.token.enable</name>
        <value>true</value>
        <description>
            If "true", access tokens are used as capabilities for accessing
            datanodes.
            If "false", no access tokens are checked on accessing datanodes.
        </description>
    </property>
    <property>
        <name>dfs.datanode.kerberos.principal</name>
        <value>hdfs/localhost@${this.realm}</value>
        <!-- <value>hdfs/_HOST@${this.realm}</value> -->
        <description>
            The Kerberos principal that the DataNode runs as. "_HOST" is
            replaced by the real host name.
        </description>
    </property>
    <property>
        <name>dfs.datanode.keytab.file</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/dn.keytab</value> -->
        <description>
            The filename of the keytab file for the DataNode.
        </description>
    </property>
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''yarn-site.xml''
#geshi(xml,number){{
    <property>
        <name>yarn.resourcemanager.principal</name>
        <value>yarn/localhost@${this.realm}</value>
        <!-- <value>yarn/_HOST@${this.realm}</value> -->
        <!-- <value>yarn/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    </property>
    <property>
        <name>yarn.resourcemanager.keytab</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/${this.cluster.name}-rm.keytab</value> -->
    </property>
    <property>
        <name>yarn.nodemanager.principal</name>
        <value>yarn/localhost@${this.realm}</value>
        <!-- <value>yarn/_HOST@${this.realm}</value> -->
    </property>
    <property>
        <name>yarn.nodemanager.keytab</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/${this.cluster.name}-nm.keytab</value> -->
    </property>
    <property>
        <name>yarn.nodemanager.admin-env</name>
        <value>MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,LD_LIBRARY_PATH=${HADOOP_COMMON_HOME}/lib/native</value>
    </property>
}}
++ &ref(images/note.png,nolink);デフォルト設定では、ネイティブライブラリのロードに失敗し MRAppMaster が起動できない場合がありますので、''yarn.nodemanager.admin-env'' に環境変数 ''LD_LIBRARY_PATH'' の設定を追加しています([[MAPREDUCE-4072>https://issues.apache.org/jira/browse/MAPREDUCE-4072]]も参照のこと)。
#geshi(text,number){{
2012-08-23 19:47:37,258 WARN [main] org.apache.hadoop.util.NativeCodeLoader: Unable to load native-hadoop library for
 your platform... using builtin-java classes where applicable
2012-08-23 19:47:37,259 FATAL [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster
java.lang.ExceptionInInitializerError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:1378)
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1348)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1437)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1463)
        at org.apache.hadoop.security.Groups.<init>(Groups.java:54)
        at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:181)
        at org.apache.hadoop.security.UserGroupInformation.initUGI(UserGroupInformation.java:249)
        at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:220)
        at org.apache.hadoop.security.UserGroupInformation.setConfiguration(UserGroupInformation.java:264)
        at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1043)
        at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1010)
Caused by: java.lang.RuntimeException: Bailing out since native library couldn't be loaded
        at org.apache.hadoop.security.JniBasedUnixGroupsMapping.<clinit>(JniBasedUnixGroupsMapping.java:48)
        ... 13 more
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''mapred-site.xml''
#geshi(xml,number){{
    <property>
        <name>mapreduce.jobhistory.principal</name>
        <value>mapred/localhost@${this.realm}</value>
        <!-- <value>mapred/_HOST@${this.realm}</value> -->
        <!-- <value>mapred/${this.cluster.name}-jh.${this.domain}@${this.realm}</value> -->
    </property>
    <property>
        <name>mapreduce.jobhistory.keytab</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/${this.cluster.name}-jh.keytab</value> -->
    </property>
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''mapred-queue-acls.xml'': ''default''キューのジョブ実行権限と管理権限を設定します。
 $ sudo cp share/hadoop/common/templates/conf/mapred-queue-acls.xml etc/hadoop/
#geshi(xml,number){{
<property>
  <name>mapred.queue.default.acl-submit-job</name>
  <value>*</value>
  <description> Comma separated list of user and group names that are allowed
    to submit jobs to the 'default' queue. The user list and the group list
    are separated by a blank. For e.g. user1,user2 group1,group2.
    If set to the special value '*', it means all users are allowed to
    submit jobs. If set to ' '(i.e. space), no user will be allowed to submit
    jobs.

    It is only used if authorization is enabled in Map/Reduce by setting the
    configuration property mapred.acls.enabled to true.

    Irrespective of this ACL configuration, the user who started the cluster and
    cluster administrators configured via
    mapreduce.cluster.administrators can submit jobs.
  </description>
</property>
<property>
  <name>mapred.queue.default.acl-administer-jobs</name>
  <value> hadoop,gridops</value>
  <!-- <value>*</value> -->
  <description> Comma separated list of user and group names that are allowed
    to view job details, kill jobs or modify job's priority for all the jobs
    in the 'default' queue. The user list and the group list
    are separated by a blank. For e.g. user1,user2 group1,group2.
    If set to the special value '*', it means all users are allowed to do
    this operation. If set to ' '(i.e. space), no user will be allowed to do
    this operation.

    It is only used if authorization is enabled in Map/Reduce by setting the
    configuration property mapred.acls.enabled to true.

    Irrespective of this ACL configuration, the user who started the cluster and
    cluster administrators configured via
    mapreduce.cluster.administrators can do the above operations on all the jobs
    in all the queues. The job owner can do all the above operations on his/her
    job irrespective of this ACL configuration.
  </description>
</property>
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''hadoop-policy.xml'': &ref(images/note.png,nolink);テンプレートをコピーして設定しますが、''${HADOOP_YARN_USER}''がうまく展開されないようですので、その部分のみリテラルで指定します。
 $ sudo cp share/hadoop/common/templates/conf/hadoop-policy.xml etc/hadoop/
#geshi(diff,number){{
$ diff -u share/hadoop/common/templates/conf/hadoop-policy.xml etc/hadoop/hadoop-policy.xml 
--- share/hadoop/common/templates/conf/hadoop-policy.xml	2012-07-19 02:25:12.000000000 +0900
+++ etc/hadoop/hadoop-policy.xml	2012-08-24 10:12:37.663437674 +0900
@@ -132,7 +132,8 @@
 
   <property>
     <name>security.resourcetracker.protocol.acl</name>
-    <value>${HADOOP_YARN_USER}</value>
+    <value>yarn</value>
+    <!-- <value>${HADOOP_YARN_USER}</value> -->
     <description>ACL for ResourceTracker protocol, used by the
     ResourceManager and NodeManager to communicate with each other.
     The ACL is a comma-separated list of user and group names. The user and
@@ -142,7 +143,8 @@
 
   <property>
     <name>security.admin.protocol.acl</name>
-    <value>${HADOOP_YARN_USER}</value>
+    <value>yarn</value>
+    <!-- <value>${HADOOP_YARN_USER}</value> -->
     <description>ACL for RMAdminProtocol, for admin commands. 
     The ACL is a comma-separated list of user and group names. The user and
     group list is separated by a blank. For e.g. "alice,bob users,wheel".
}}

** セキュアDataNode [#b5c962d5]

- DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
+ Hadoopには、jsvc が同梱されていないため、パッケージインストールします。
 $ sudo apt-get install jsvc
++ &ref(images/info.png,nolink);参考までに、未インストール時にHadoopが出すエラー内容は以下の通り。
#geshi(text,number){{
JSVC_HOME is not set correctly so jsvc can not be found. Jsvc is required to run secure datanodes. 
Please download and install jsvc from http://archive.apache.org/dist/commons/daemon/binaries/  and set JSVC_HOME to the
 directory containing the jsvc binary.
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''hadoop-env.sh'' にセキュアDataNodeの設定を追加します。jsvc が依存する Commons Daemonライブラリについては、(同梱されているものではなく)先程パッケージインストールしたものを最初に参照するようにCLASSPATHを設定します。''$JSVC_HOME'' については、jsvcコマンドが含まれるディレクトリを指定します。
#geshi(bash,number){{
export HADOOP_SECURE_DN_USER=hdfs
export HADOOP_SECURE_DN_PID_DIR=/grid/vol/0/var/run/${HADOOP_SECURE_DN_USER}
export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
export JSVC_HOME=/usr/bin
# Extra Java CLASSPATH elements.  Optional.
if [ x"$HADOOP_CLASSPATH" = x ]; then
    export HADOOP_CLASSPATH=/usr/share/java/commons-daemon.jar
else
    # for Hive and HCatalog
    export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/share/java/commons-daemon.jar
fi
export HADOOP_USER_CLASSPATH_FIRST=true
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''hdfs-site.xml''
#geshi(xml,number){{
    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:1004</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:1006</value>
    </property>
}}
+ hdfsユーザではなく、&color(red){''root''};でDataNodeを起動させます。起動後、デーモンのオーナはhdfsにスイッチされます。
 $ sudo sbin/hadoop-daemon.sh start datanode

** ユーザ権限でのリソースコンテナ起動(&ref(images/tux.png,nolink);LinuxContainerExecutor) [#g2c5037d]

+ ソースパッケージをダウンロードし、環境に合わせて LinuxContainerExecutor をビルドし配備します。ちなみに、バイナリパッケージに同梱されているのは''x86_64''版の実行ファイルですので、''i386''環境の場合にはソースからのビルドが必須となります。
++ ビルドに必要なMavenの3.x系とProtocolBuffersをあらかじめインストールしてからビルドします。
#geshi{{
[for Debian] $ sudo apt-get install ant build-essential autoconf libtool
[for CentOS] $ sudo yum install ant autoconf automake libtool
...
$ file ${HADOOP_PREFIX}/bin/container-executor 
bin/container-executor: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),
 for GNU/Linux 2.6.9, not stripped
...
$ tar xvzf hadoop-2.0.1-alpha-src.tar.gz
$ cd hadoop-2.0.1-alpha-src/hadoop-mapreduce-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]=0x8e2e2dd23805d8bf563ae7bf46b5fa80883b3adf,
 not stripped
}}
++ 生成された実行ファイルを適切な場所にコピーし、NodeManagerの起動ユーザのみが所属するグループ(yarn)についてsetgid属性を付与します。
#geshi{{
$ sudo mv ${HADOOP_PREFIX}/bin/container-executor ${HADOOP_PREFIX}/bin/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
}}
+ LinuxContainerExecutor の設定ファイル(${HADOOP_PREFIX}/etc/hadoop/''container-executor.cfg'')を ${HADOOP_PREFIX}/etc/hadoop/''mapred-site.xml'' と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。
#geshi(bash,number){{
yarn.nodemanager.local-dirs=/grid/vol/0/var/lib/yarn/nm/local
yarn.nodemanager.log-dirs=/grid/vol/0/var/log/yarn/nm
yarn.nodemanager.linux-container-executor.group=yarn
banned.users=hfds,yarn,mapred,bin
#min.user.id=1000    # default
}}
 $ sudo chown root:root etc/hadoop/container-executor.cfg 
 $ sudo chmod 0400      etc/hadoop/container-executor.cfg
++ &ref(images/centos.png,nolink);CentOSでは一般ユーザのuidは通常''500''から振られるため、container-executor.cfgの''min.user.id'' の設定を500に引き下げることをお忘れなく。
#geshi(bash,number){{
#min.user.id=1000    # default
min.user.id=500    # for CentOS
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''yarn-site.xml'' の設定で、LinuxContainerExecutor を有効にします。
#geshi(xml,number){{
    <property>
        <name>yarn.nodemanager.container-executor.class</name>
        <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.group</name>
        <value>yarn</value>
    </property>
}}
-- &ref(images/note.png,nolink);はじめに ''Default''ContainerExecutor を利用していた場合には、切り替え後に以下のようなパーミッションエラーが発生します。一度ユーザキャッシュディレクトリを削除する必要があります。
#geshi(text,number){{
12/08/22 20:49:37 INFO mapreduce.Job: Job job_1345599985340_0001 failed with state FAILED due to:
 Application application_1345599985340_0001 failed 1 times due to AM Container for appattempt_1345599985340_0001_000001
 exited with  exitCode: -1000 due to: java.io.IOException: App initialization failed (255) with output: main : command
 provided 0
main : user is alice
Can't open appcache in /grid/vol/0/var/lib/yarn/nm/local/usercache/alice/appcache/application_1345599985340_0001 -
 Permission denied
Did not create any app directories

	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
LinuxContainerExecutor.java:175)
	at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService
$LocalizerRunner.run(ResourceLocalizationService.java:862)
Caused by: org.apache.hadoop.util.Shell$ExitCodeException: 
	at org.apache.hadoop.util.Shell.runCommand(Shell.java:203)
	at org.apache.hadoop.util.Shell.run(Shell.java:130)
	at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:323)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
LinuxContainerExecutor.java:167)
	... 1 more
}}

** ProxyUser(Secure Impersonation)の設定 [#k4cb3a35]

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

** WebコンソールのSPNEGO/Kerberos設定 [#k4631109]

- 各HadoopサービスのWebコンソールにもKerberos認証によるシングルサインオンでアクセスするため、SPNEGO/Kerberosの設定を行います。

+ まず署名のためのシークレットファイルを用意し、パーミッションを適切に設定します。完全分散の場合には、各ノードに同じシークレットファイルを配備します。
 $ sudo chmod 640 /grid/etc/hadoop-http-auth-signature-secret 
 $ sudo chown root:hadoop /grid/etc/hadoop-http-auth-signature-secret
+ ${HADOOP_PREFIX}/etc/hadoop/''core-site.xml'' を編集します。''hadoop.http.filter.initializers'' プロパティに ''org.apache.hadoop.security.AuthenticationFilterInitializer'' を設定し、''hadoop.http.authentication.type'' を ''kerberos'' にします。
#geshi(xml,number){{
    <property>
        <name>hadoop.http.filter.initializers</name>
        <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
        <!-- <value>org.apache.hadoop.http.lib.StaticUserWebFilter</value> -->
        <description>The name of a class that initializes an input filter for Jetty.
            This filter will always return Dr.Who as the web user when the servlets
            query for the authenticated user </description>
    </property>
    <property>
        <name>hadoop.http.authentication.signature.secret.file</name>
        <value>/grid/etc/hadoop-http-auth-signature-secret</value>
    </property>
    <property>
        <name>hadoop.http.authentication.cookie.domain</name>
        <value>localhost</value>
        <!-- <value>grid.example.com</value> -->
    </property>
    <property>
        <name>hadoop.http.authentication.type</name>
        <value>kerberos</value>
        <description>Defines authentication used for the HTTP web-consoles.
            The supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#.
            The dfeault value is simple.</description>
    </property>
    <property>
        <name>hadoop.http.authentication.kerberos.principal</name>
        <value>HTTP/localhost@${this.realm}</value>
    </property>
    <property>
        <name>hadoop.http.authentication.kerberos.keytab</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
    </property>
}}
+ ${HADOOP_PREFIX}/etc/hadoop/''hdfs-site.xml'': HDFSのWebコンソールで使用するプリンシパルを設定します。
#geshi(xml,number){{
    <property>
        <name>dfs.web.authentication.kerberos.principal</name>
        <value>HTTP/localhost@${this.realm}</value>
    </property>
    <property>
        <name>dfs.web.authentication.kerberos.keytab</name>
        <value>${this.keytab.dir}/localhost.keytab</value>
        <!-- <value>${this.keytab.dir}/web.keytab</value> -->
    </property>
    <property>
        <name>dfs.namenode.kerberos.internal.spnego.principal</name>
        <value>${dfs.web.authentication.kerberos.principal}</value>
        <!-- <value>HTTP/_HOST@${this.realm}</value> -->
        <!-- <value>HTTP/${this.cluster.name}-nn.${this.domain}@${this.realm}</value> -->
    </property>
    <property>
        <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
        <value>${dfs.web.authentication.kerberos.principal}</value>
        <!-- <value>HTTP/_HOST@${this.realm}</value> -->
        <!-- <value>HTTP/${this.cluster.name}-cn.${this.domain}@${this.realm}</value> -->
    </property>
}}
+ 編集後、各デーモンプロセスを再起動し反映させます。
+ ブラウザからのアクセス方法については、[[SPNEGOonBrowser]]をご参照ください。

** その他のサービス [#x873c672]

+ [[HttpFS>HttpFS2.0aセットアップ]]
+ [[WebHDFS>WebHDFS2.0aセットアップ]]

* テスト [#n7897fd0]

+ ACL設定を追加して実行します。
#geshi(){{
$ sudo -u alice kinit
Password for alice@LOCALHOST: 
$ sudo -u alice bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.0.1-alpha.jar pi \
> -D mapreduce.job.acl-view-job=* -D mapreduce.job.acl-modify-job=alice 5 10
}}

* 参考リソース [#c7ba5e7b]

+ [[設定ファイル一式>metasearchSvn:/hadoop_conf/branches/localhost-2.0/]]
+ [[Hadoop MapReduce Next Generation - Cluster Setup>http://hadoop.apache.org/common/docs/r2.0.0-alpha/hadoop-yarn/hadoop-yarn-site/ClusterSetup.html]]
+ [[CDH4 Security Guide>https://ccp.cloudera.com/display/CDH4DOC/CDH4+Security+Guide]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS