Hadoop > CDH >

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

CDH5.0withSecurityセットアップ

CDH > CDH5.0セットアップ >

目次

はじめに

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

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

  1. CDH4
  2. CDH3 - DEPRECATED

セットアップ

Chefレシピ

参考までに、これはここで説明しているセキュア疑似分散環境を構築するChefレシピ(ロール)です。

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed-with-security.rb: これはデフォルトでは、Apache版のセキュアHadoopクラスタを構築するロールです。
    • cake.pnggrid-chef-repo:/roles/test-cdh-on-localhost.rb: CDHでクラスタ構築する場合には、このロールのように run_list に yum-cdh および hadoop-pseudo-distributed-with-security ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::cdh レシピは、RPMパッケージを用いてCDHのインストールを行います。
      1. name 'test-cdh-on-localhost'
      2. description 'Testing Cloudera\'s Distribution, including Apache Hadoop on local machine'
      3.  
      4. run_list(
      5.   'role[node_commons]',
      6.   'role[chef_utils]',
      7.   'role[nameservice-client]',
      8.   'role[ganglia-all-in-one-localhost]',
      9.   'role[nagios]',
      10.   'role[yum-cdh]',
      11.   #'role[hadoop-pseudo-distributed]',
      12.   'role[hadoop-pseudo-distributed-with-security]',
      13.   'role[java7]',
      14. )
      15.  
      16. # (...)
      17.  
      18. default_attributes(
      19.   'cdh' => {
      20.     'version' => '5.0.0',
      21.   },
      22.   'hadoop' => {
      23.     'install_flavor' => 'cdh',
      24.     'HADOOP_CLASSPATH' => '',
      25.     'HADOOP_USER_CLASSPATH_FIRST' => 'false',
      26.     # for 2.0.x only
      27.     'container-executor' => {
      28.       'min.user.id' => '500'
      29.     },
      30.     #'yarn.nodemanager.linux-container-executor.resources-handler.class' \
      31.     #  => 'org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler',
      32.     },
      33.   }
      34. )

Java

  1. Oracle(旧Sun)のJDKでは、後述のKerberos認証で強度の高いAES256暗号を利用するためには、強度が無制限のJCE管轄ポリシーファイルをインストールする必要があります。インストールにあたっては、Javaにおける高強度暗号の利用をご参照ください。※CDHでは推奨されていませんが、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ファイルを作成します。info.pngCDH4以降ではKSSLの実装は削除されていますので、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ファイルを作成します。info.pngCDH4以降ではKSSLの実装は削除されていますので、NameNodeSecondaryNameNodeのための host/ プリンシパルは不要です。
    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. CDH4以降には hadoop.security.group.mapping に設定する GroupMappingServiceProvider? としてHadoop 2.0と同様に 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のhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。
  1. /etc/hadoop/conf/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>LOCALHOST</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. -->

セキュアHDFS

  1. /etc/hadoop/conf/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/${this.namenode.fqdn}@${this.realm}</value>
    10.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    11.         <description>Kerberos principal name for the NameNode</description>
    12.     </property>
    13.     <property>
    14.         <name>dfs.namenode.keytab.file</name>
    15.         <value>${this.keytab.dir}/nn.keytab</value>
    16.         <description>
    17.             Combined keytab file containing the namenode service and host
    18.             principals.
    19.         </description>
    20.     </property>
    21.     <property>
    22.         <name>dfs.secondary.namenode.kerberos.principal</name>
    23.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    24.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    25.         <description>
    26.             Kerberos principal name for the secondary NameNode.
    27.         </description>
    28.     </property>
    29.     <property>
    30.         <name>dfs.secondary.namenode.keytab.file</name>
    31.         <value>${this.keytab.dir}/cn.keytab</value>
    32.         <description>
    33.             Combined keytab file containing the namenode service and host
    34.             principals.
    35.         </description>
    36.     </property>
    37.     <property>
    38.         <name>dfs.block.access.token.enable</name>
    39.         <value>true</value>
    40.         <description>
    41.             If "true", access tokens are used as capabilities for accessing
    42.             datanodes.
    43.             If "false", no access tokens are checked on accessing datanodes.
    44.         </description>
    45.     </property>
    46.     <property>
    47.         <name>dfs.datanode.kerberos.principal</name>
    48.         <value>hdfs/localhost@${this.realm}</value>
    49.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    50.         <description>
    51.             The Kerberos principal that the DataNode runs as. "_HOST" is
    52.             replaced by the real host name.
    53.         </description>
    54.     </property>
    55.     <property>
    56.         <name>dfs.datanode.keytab.file</name>
    57.         <value>${this.keytab.dir}/dn.keytab</value>
    58.         <description>
    59.             The filename of the keytab file for the DataNode.
    60.         </description>
    61.     </property>
    62.     <!-- (...) -->
    63.     <property>
    64.         <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    65.         <value>${dfs.web.authentication.kerberos.principal}</value>
    66.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    67.     </property>
    68.     <property>
    69.         <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    70.         <value>${dfs.web.authentication.kerberos.principal}</value>
    71.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    72.     </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. リリースノートによると、CDH4以降では一歩進んで従来の KSSL による実装を削除していますので、この説明では SPNEGO/Kerberos にてセットアップを行なっています。

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. セキュアDataNodeの起動に必要な jsvc は依存関係にある bigtop-jsvc パッケージでインストールされます。
  2. /etc/default/hadoop-hdfs-datanode にセキュアDataNodeの設定を追加します。note.png残念ながら、/etc/hadoop/conf/hadoop-env.sh では設定がうまく有効になりません。ただし、ログ出力先(SecurityAuth?-hdfs.audit と hadoop-hdfs-datanode-*.log のみ)については、hadoop-env.sh の HADOOP_LOG_DIR が優先されますので注意が必要です。
    1. export HADOOP_SECURE_DN_USER=hdfs
    2. export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    3. export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/hdfs
    4. # NG: $HADOOP_SECURE_DN_USER is N/A!
    5. #export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
  3. /etc/hadoop/conf/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. 通常どおりDataNodeを起動させます。
    $ sudo service hadoop-hdfs-datanode start

セキュアYARN

  1. /etc/hadoop/conf/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. note.pngデフォルト設定では、ネイティブライブラリのロードに失敗し MRAppMaster? が起動できない場合がありますので、yarn.nodemanager.admin-env に環境変数 LD_LIBRARY_PATH の設定を追加しています(MAPREDUCE-4072も参照のこと)。

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

  1. container-executor バイナリは hadoop-yarn パッケージでインストールされますので、特別な作業は必要ありません。パーミッションを確認しておきます。
    $ ls -l /usr/lib/hadoop-yarn/bin/container-executor
    ---Sr-s--- 1 root yarn 36024 Oct 28 09:28 /usr/lib/hadoop-yarn/bin/container-executor
  2. LinuxContainerExecutor? の設定ファイル(/etc/hadoop/conf/container-executor.cfg)を作成し、 /etc/hadoop/conf/mapred-site.xml と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。yarn.nodemanager.(local|log)-dirs の設定はすでに不要のようです。また、Apache Hadoop 2.2.0と同様に allowed.system.users 設定が追加されていますが、追加でシステムユーザによるYARNアプリケーションの実行がない場合には設定の必要はないでしょう。note.pngただし、この設定ファイル中では値のクォーティングや空値(=の直後に何もない状態)は許容されませんので、ご注意ください。
    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
    8. #comma separated list of system users who CAN run applications
    9. #allowed.system.users=
    $ sudo chown root:root /etc/hadoop/conf/container-executor.cfg 
    $ sudo chmod 0400      /etc/hadoop/conf/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. /etc/hadoop/conf/yarn-site.xml の設定で、DefaultContainerExecutor? に替えて、LinuxContainerExecutor? を有効にします。なお、CDHではこの5.0.0からはじめて利用可能となった 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.x相当のYARNで利用するのはまだcpuサブシステムのみのようです。
      1. 以下は ubuntu.pngUbuntu 13.04の例(マウントポイントは、/sys/fs/cgroup)ですが、Ubuntu では、cgconfig 及び CGroup Rules Engine Daemon サービスが削除されています*1ので、独自の方法でリソース管理グループをセットアップする必要があります。以下では、はじめに相当するシェルコマンドで示しています。次に、Upstartジョブ(/etc/init/cgconfig4yarn.conf)を用意してセットアップする方法を示しています。
        $ sudo mkdir /sys/fs/cgroup/cpu/hadoop-yarn
        $ sudo chown -R yarn:yarn /sys/fs/cgroup/cpu/hadoop-yarn
        1. description "cgroup configurations for YARN"
        2.  
        3. start on started cgroup-lite
        4.  
        5. script
        6.     for subsys in cpu; do
        7.         HIERARCHY_PATH=/sys/fs/cgroup/${subsys}/hadoop-yarn
        8.         if [ ! -d $HIERARCHY_PATH ]; then
        9.             mkdir $HIERARCHY_PATH
        10.             chown -R yarn:yarn $HIERARCHY_PATH
        11.         fi
        12.     done
        13. end script
      2. debian.pngDebian や centos.pngCentOS であれば、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 /cgroup/cpu/hadoop-yarn
        total 0
        --w--w--w- 1 yarn yarn 0 Nov  4 11:49 cgroup.event_control
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cgroup.procs
        drwxr-xr-x 2 yarn yarn 0 Nov  4 12:08 container_1383534027055_0001_01_000001
        drwxr-xr-x 2 yarn yarn 0 Nov  4 12:08 container_1383534027055_0001_01_000002
        drwxr-xr-x 2 yarn yarn 0 Nov  4 12:08 container_1383534027055_0001_01_000003
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.cfs_period_us
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.cfs_quota_us
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.rt_period_us
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.rt_runtime_us
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.shares
        -r--r--r-- 1 yarn yarn 0 Nov  4 11:49 cpu.stat
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 notify_on_release
        -rw-r--r-- 1 yarn yarn 0 Nov  4 11:49 tasks
    • note.pngはじめに DefaultContainerExecutor? を利用していた場合には、切り替え後に以下のようなパーミッションエラーが発生します。一度ユーザキャッシュディレクトリを削除する必要があります。
      1. 13/03/08 20:05:06 INFO mapreduce.Job: Job job_1362721746251_0001 failed with state FAILED due to: Application
      2.  application_1362721746251_0001 failed 1 times due to AM Container for appattempt_1362721746251_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_1362721746251_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:175)
      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:261)
      16. at org.apache.hadoop.util.Shell.run(Shell.java:188)
      17. at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:381)
      18. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
      19. LinuxContainerExecutor.java:167)
      20. ... 1 more
      21.  
      22. .Failing this attempt.. Failing the application.
      $ sudo rm -R /grid/vol/0/var/lib/yarn/nm/local/usercache
      # YARN を再起動します。

CapacityScheduler?のアクセス制御

  1. /etc/hadoop/conf/capacity-scheduler.xml: 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 yarn rmadmin -refreshQueues
  3. 各ユーザは、以下のコマンドで自分に付与されている権限を確認することができます。
    $ sudo -u yarn mapred queue -showacls
    ...
    Queue acls for user :  yarn
    
    Queue  Operations
    =====================
    root  ADMINISTER_QUEUE
    default  ADMINISTER_QUEUE,SUBMIT_APPLICATIONS
    $ sudo -u alice mapred queue -showacls
    ...
    Queue acls for user :  alice
    
    Queue  Operations
    =====================
    root  
    default  SUBMIT_APPLICATIONS

MapReduce?アプリケーション

  1. /etc/hadoop/conf/mapred-site.xml: JobHistoryServer?のKerberos認証関連設定を行います。
    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>

セキュアMapReduce? v1

※説明は割愛します。

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. /etc/hadoop/conf/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等へのリクエストがリプレイ攻撃*2と判断されてしまいます。そのような場合には、やむを得ませんので 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, 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. /etc/hadoop/conf/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/localhost@${this.realm}</value>
    12.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    13.     </property>
    14.     <property>
    15.         <name>dfs.web.authentication.kerberos.keytab</name>
    16.         <value>${this.keytab.dir}/HTTP.keytab</value>
    17.     </property>
  4. /etc/hadoop/conf/yarn-site.xml: info.pngCDHでは、5.0.0以降ではじめて設定プロパティが分離されましたので、YARNのWebコンソールで使用するプリンシパルを設定します。値の中には特殊変数 _HOST が使用できますので、ワーカノード(NodeManager?)についてはこれを用いて設定するとよいでしょう。
    1.     <property>
    2.         <name>yarn.resourcemanager.webapp.spnego-principal</name>
    3.         <value>HTTP/${this.resourcemanager.fqdn}@${this.realm}</value>
    4.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    5.     </property>
    6.     <property>
    7.         <name>yarn.resourcemanager.webapp.spnego-keytab-file</name>
    8.         <value>${this.keytab.dir}/HTTP.keytab</value>
    9.     </property>
    10.     <property>
    11.         <name>yarn.nodemanager.webapp.spnego-principal</name>
    12.         <value>HTTP/localhost@${this.realm}</value>
    13.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    14.     </property>
    15.     <property>
    16.         <name>yarn.nodemanager.webapp.spnego-keytab-file</name>
    17.         <value>${this.keytab.dir}/HTTP.keytab</value>
    18.     </property>
  5. /etc/hadoop/conf/mapred-site.xml: info.png同様にこちらもCDH5.0.0以降ではじめて設定プロパティが分離されましたので、JobHistoryServer?のWebコンソールで使用するプリンシパルを設定します。値の中には特殊変数 _HOST が使用できますが、こちらは明示的に設定した方がよいでしょう。
    1.     <property>
    2.         <name>mapreduce.jobhistory.webapp.spnego-principal</name>
    3.         <value>HTTP/${this.jobhistory.fqdn}@${this.realm}</value>
    4.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    5.     </property>
    6.     <property>
    7.         <name>mapreduce.jobhistory.webapp.spnego-keytab-file</name>
    8.         <value>${this.keytab.dir}/HTTP.keytab</value>
    9.     </property>
  6. 編集後、各デーモンプロセスを再起動し反映させます。
  7. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS?
  2. WebHDFS?

テスト

  1. ACL設定を追加して実行します。
    $ sudo -u alice kinit
    Password for alice@LOCALDOMAIN: 
    $ sudo -u alice hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi \
    > -D mapreduce.job.acl-view-job=* -D mapreduce.job.acl-modify-job=alice 5 10
     or
    $ sudo -u alice yarn jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.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. CDH5 Security Guide

*1 cgroup-bin (deleted) init scripts stick around
*2 Step 4: Create and Deploy the Kerberos Principals and Keytab Files

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-11-03 (日) 15:37:12 (1746d)