Hadoop >

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

Hadoop1.0withSecurityセットアップ

Hadoop1.0セットアップ >

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

目次

はじめに

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

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

  1. Hadoop0.20.2xxWithSecurityセットアップ - DEPRECATED
  2. Hadoop0.20.2xxWithSecurityセットアップ(旧) - DEPRECATED

セットアップ

Java

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

Kerberos認証環境

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

Kerberos設定ファイル(KSSLの弱強度暗号タイプサポート)

  • note.pngHDFSのチェックポイント機構(およびfsck)にKSSL(Kerberized SSL)を利用しなければならない Ver. 1.0 以前では、残念ながらJDK6のバグにより弱い強度の暗号タイプ(des-cbc-crc、des-cbc-md5)をサポートしなければいけません。Kerberos認証環境全体の暗号強度を一様に低く設定することはお勧めできませんので、チェックポイント機構が動作する範囲で可能な限り高強度の暗号タイプを使用するように設定します。
  • info.png代替としてSPNEGO/Kerberosが導入されたVer. 1.1.0、2.0.2以降のHadoopではこの問題の影響を受けませんので、可能であればそれらのバージョンの利用をご検討ください。
  1. Kerberos管理サーバ、KDC
    1. /etc/krb5.conf: 弱い強度の暗号タイプ(des-cbc-crc、des-cbc-md5)のサポートを追加します。
      1. [libdefaults]
      2. ...
      3. # for weak crypto
      4. allow_weak_crypto = true
      5. default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5 des-cbc-crc des-cbc-md5
      6. default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5 des-cbc-crc des-cbc-md5
      7. permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5 des-cbc-crc des-cbc-md5
  2. Hadoopノード
    1. ${HADOOP_HOME}/conf/hadoop-env.sh: システムプロパティ java.security.krb5.conf の設定で、各デーモン、クライアント実行時に必要十分な内容のKerberos設定ファイルを参照するようにします。note.pngfsckコマンドのみKSSLを使用してアクセスしますので、fsckを実行する場合には HADOOP_CLIENT_OPTS 環境変数で、HDFSと同様のKerberos設定ファイルを参照させる必要があります。
      1. KRB5_WEAK_CONF="-Djava.security.krb5.conf=${HADOOP_PREFIX}/conf/krb5-weak.conf"
      2. KRB5_STRONG_CONF="-Djava.security.krb5.conf=${HADOOP_PREFIX}/conf/krb5-strong.conf"
      3. export HADOOP_NAMENODE_OPTS="$KRB5_WEAK_CONF $HADOOP_NAMENODE_OPTS"
      4. export HADOOP_SECONDARYNAMENODE_OPTS="$KRB5_WEAK_CONF $HADOOP_SECONDARYNAMENODE_OPTS"
      5. export HADOOP_DATANODE_OPTS="$KRB5_STRONG_CONF $HADOOP_DATANODE_OPTS"
      6. export HADOOP_BALANCER_OPTS="$KRB5_STRONG_CONF $HADOOP_BALANCER_OPTS"
      7. export HADOOP_JOBTRACKER_OPTS="$KRB5_STRONG_CONF $HADOOP_JOBTRACKER_OPTS"
      8. export HADOOP_TASKTRACKER_OPTS="$KRB5_STRONG_CONF $HADOOP_TASKTRACKER_OPTS"
      9. # for fsck command only
      10. #export HADOOP_CLIENT_OPTS="$KRB5_WEAK_CONF $HADOOP_CLIENT_OPTS"
      11. # for standard hadoop sub-commands
      12. export HADOOP_CLIENT_OPTS="$KRB5_STRONG_CONF $HADOOP_CLIENT_OPTS"
      1. ${HADOOP_HOME}/conf/krb5-weak.conf: NameNodeSecondaryNameNode用弱強度設定。チェックポイント機構が動作するよう default_tgs_enctypes で弱い強度の暗号タイプ(des-cbc-crc、des-cbc-md5)の使用を強制し、他の設定ではそのサポートを追加します。
        1. [libdefaults]
        2. ...
        3. # for weak crypto
        4. allow_weak_crypto = true
        5. default_tgs_enctypes = des-cbc-crc des-cbc-md5
        6. default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5 des-cbc-crc des-cbc-md5
        7. permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5 des-cbc-crc des-cbc-md5
      2. ${HADOOP_HOME}/conf/krb5-strong.conf: 他ノード用高強度設定。
        1. [libdefaults]
        2. ...
        3. # for strong crypto
        4. # note: same settings with HDFS (weak crypto)
        5. default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
        6. default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
        7. permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
      3. /etc/krb5.conf: クライアント用。一般ユーザ利用するコマンドの範囲では影響を受けませんので、高強度の暗号タイプのみを許可します。
        1. [libdefaults]
        2. ...
        3. # for strong crypto
        4. default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
        5. default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
        6. permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
  • info.png参考までに、弱強度暗号をサポートしていない場合には、チェックポイント実行時に以下のようなエラーとなります。
    1. NameNode
      1. 2013-04-19 19:47:04,813 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Roll Edit Log from 127.0.0.1
      2. 2013-04-19 19:47:04,813 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 2 Total time
      3.  for transactions(ms): 1Number of transactions batched in Syncs: 0 Number of syncs: 2 SyncTimes(ms): 76
      4. 2013-04-19 19:47:05,073 WARN org.mortbay.log: EXCEPTION
      5. javax.net.ssl.SSLHandshakeException: Invalid Padding length: 240
      6.     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
      7.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1747)
      8.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:910)
      9.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
      10.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
      11.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
      12.     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:708)
      13.     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
      14. Caused by: javax.crypto.BadPaddingException: Invalid Padding length: 240
      15.     at com.sun.net.ssl.internal.ssl.CipherBox.removePadding(CipherBox.java:475)
      16.     at com.sun.net.ssl.internal.ssl.CipherBox.decrypt(CipherBox.java:255)
      17.     at com.sun.net.ssl.internal.ssl.InputRecord.decrypt(InputRecord.java:134)
      18.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:905)
      19.     ... 5 more
    2. SecondaryNameNode
      1. 2013-04-19 19:47:05,075 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException
      2.  as:hdfs/localhost@LOCALDOMAIN cause:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
      3. 2013-04-19 19:47:05,075 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint:
      4. 2013-04-19 19:47:05,076 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode:
      5.  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
      6.     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
      7.     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
      8.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
      9.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
      10.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
      11.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
      12.     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
      13.     at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
      14.     at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
      15.     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
      16.     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
      17.     at org.apache.hadoop.hdfs.server.namenode.TransferFsImage.getFileClient(TransferFsImage.java:160)
      18.     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$3.run(SecondaryNameNode.java:347)
      19.     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$3.run(SecondaryNameNode.java:336)
      20.     at java.security.AccessController.doPrivileged(Native Method)
      21.     at javax.security.auth.Subject.doAs(Subject.java:396)
      22.     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
      23.     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.downloadCheckpointFiles(SecondaryNameNode.java:336)
      24.     at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:411)
      25. ...

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

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

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

  1. 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。note.png通常、KDCにおいては暗号タイプを指定しない場合には高強度(aes256-cts:normal aes128-cts:normal arcfour-hmac:normal)のキーのみを生成する設定(supported_enctypes)になっているものと想定していますので、NameNodeおよびSecondaryNameNodehost/ サービスプリンシパルを追加する場合には、上記のKSSL問題の対応のため弱強度の暗号タイプのキーが必要となりますのでそれらも含めてすべてのタイプを明示的に指定します。
    $ sudo mkdir -p /grid/etc/keytabs/localhost
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey hdfs/localhost
    ...
    kadmin.local:  add_principal -randkey -e "aes256-cts:normal aes128-cts:normal arcfour-hmac:normal des-cbc-crc:normal" host/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: WRFILE:/grid/etc/keytabs/localhost/localhost.keytab
    KVNO Timestamp         Principal
    ---- ----------------- --------------------------------------------------------
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (ArcFour with HMAC/md5) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (ArcFour with HMAC/md5) 
       2 06/05/12 18:30:40 host/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 host/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 host/localhost@LOCALDOMAIN (ArcFour with HMAC/md5) 
       2 06/05/12 18:30:40 host/localhost@LOCALDOMAIN (DES cbc mode with CRC-32) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (ArcFour with HMAC/md5)
    
    $ 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 jt.keytab
    $ sudo ln -s localhost.keytab tt.keytab
    $ sudo ln -s localhost.keytab jh.keytab
    $ sudo ln -s localhost.keytab HTTP.keytab

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

  1. 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。
    kadmin.local:  add_principal -randkey hdfs/pleiades-nn.grid.example.com
    WARNING: no policy specified for hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM; defaulting to no policy
    Principal "hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM" created.
    kadmin.local:  add_principal -randkey hdfs/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jt.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jh.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey -e "aes256-cts:normal aes128-cts:normal arcfour-hmac:normal des-cbc-crc:normal" host/pleiades-nn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey -e "aes256-cts:normal aes128-cts:normal arcfour-hmac:normal des-cbc-crc:normal" host/pleiades-cn.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-jt.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/jt.keytab -glob */pleiades-jt.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 hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-dn.keytab hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-tt.keytab mapred/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-tt.keytab mapred/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-HTTP.keytab HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-HTTP.keytab HTTP/dn00001.grid.example.com
    ...
  2. 各ノードに必要keytabファイルを配備します。DataNode/TaskTrackerのkeytabファイルについては、設定の便宜のため配備後、ホスト名部分を削除した dn.keytabtt.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
    jt:$ sudo chown mapred:mapred jt.keytab
    jt:$ sudo chmod 400           jt.keytab
    jh:$ sudo chown mapred:mapred jh.keytab
    jh:$ sudo chmod 400           jh.keytab
    dn:$ sudo chown hdfs:hdfs dn.keytab
    dn:$ sudo chmod 400       dn.keytab
    dn:$ sudo chown mapred:mapred tt.keytab
    dn:$ sudo chmod 400           tt.keytab
    dn:$ sudo chown hdfs:hadoop   dn-HTTP.keytab
    dn:$ sudo chmod 440           dn-HTTP.keytab    # for DataNode & TaskTracker
    
    # SPNEGO用プリンシパルのために各ノードで適当なkeytabにシンボリックリンクします
     *:$ sudo ln -s {{nn,cn,jt,jh},dn-HTTP}.keytab HTTP.keytab

LDAP認可環境

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

セキュアHadoop基盤

  • テスト環境としてセットアップしやすいように、以下の例では主にKerberos認証環境の設定について疑似分散(シングルノード)の設定例を示しています。完全分散(Hadoop完全分散モデル環境)の設定は、XMLのコメントとして添えてありますのでご参照ください。
  • note.pngプリンシパルの設定に利用できる特殊変数 _HOST はコンテクストによってその置換規則が異なります。明示的な設定では柔軟に対応できない場合(例えば、dfs.web.authentication.kerberos.principal)がありますので、基本的には _HOST を使用して設定すべきです。
    • 原則的に、マスタノード(NameNodeJobTracker)の場合にはサービスするDNS名で置換され、ワーカノード(DataNodeTaskTracker)の場合にはその hostname で置換されます。またマスタノードでサービスするDNS名は該当する各プロパティ(fs.default.name、mapred.job.tracker等)の値によって判断されますので注意が必要です(デフォルト設定ではなく明示的に設定する必要があります)。さらに、プロパティによってはバージョンによって _HOST の利用が未実装の場合(例えば、1.0.xのhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。
  1. ${HADOOP_HOME}/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>LOCALDOMAIN</value>
    14.         <!-- <value>GRID.EXAMPLE.COM</value> -->
    15.     </property>
    16.     <property>
    17.         <name>this.keytab.dir</name>
    18.         <value>/grid/etc/keytabs/${this.cluster.name}</value>
    19.     </property>
    20.     <property>
    21.         <name>this.namenode.fqdn</name>
    22.         <value>localhost</value>
    23.         <!-- <value>${this.cluster.name}-nn.${this.domain}</value> -->
    24.     </property>
    25.  
    26.     <property>
    27.         <name>fs.default.name</name>
    28.         <value>hdfs://${this.namenode.fqdn}:9000</value>
    29.     </property>
    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.     <property>
    46.         <name>hadoop.security.auth_to_local</name>
    47.         <value>
    48.             RULE:[2:$1@$0](.*@${this.realm})s/@.*//
    49.             RULE:[1:$1@$0](.*@${this.realm})s/@.*//
    50.             RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
    51.             RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
    52.             DEFAULT
    53.         </value>
    54.     </property>
    55.     <property>
    56.         <name>hadoop.security.group.mapping</name>
    57.         <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    58.     </property>
    59.     <property>
    60.         <name>hadoop.security.groups.cache.secs</name>
    61.         <value>14400</value>
    62.     </property>
    63.     <property>
    64.         <name>hadoop.kerberos.kinit.command</name>
    65.         <value>/usr/bin/kinit</value>
    66.     </property>
  2. ${HADOOP_HOME}/conf/hdfs-site.xml: KSSL(Kerberized SSL、TLS/Kerberos)の設定である dfs.(|secondary.)https.(port|address) はデフォルト設定で動作してほしいところですが、設定の有無が重要で明示的に追加する必要があります。
    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.cluster.administrators</name>
    9.         <value> hdfs</value>
    10.     </property>
    11.     <property>
    12.         <name>dfs.http.port</name>
    13.         <value>50070</value>
    14.         <description>The http port where namenode binds</description>
    15.     </property>
    16.     <property>
    17.         <name>dfs.http.address</name>
    18.         <value>${this.namenode.fqdn}:${dfs.http.port}</value>
    19.         <description>The http address where namenode binds</description>
    20.     </property>
    21.     <property>
    22.         <name>dfs.https.port</name>
    23.         <value>50470</value>
    24.         <description>The https port where namenode binds</description>
    25.     </property>
    26.     <property>
    27.         <name>dfs.https.address</name>
    28.         <value>${this.namenode.fqdn}:${dfs.https.port}</value>
    29.         <description>The https address where namenode binds</description>
    30.     </property>
    31.     <property>
    32.         <name>dfs.namenode.kerberos.principal</name>
    33.         <value>hdfs/_HOST@${this.realm}</value>
    34.         <!-- _HOST is replaced with the fs.default.name's host name -->
    35.         <!-- <value>hdfs/${this.namenode.fqdn}@${this.realm}</value> -->
    36.         <description>Kerberos principal name for the NameNode</description>
    37.     </property>
    38.     <property>
    39.         <name>dfs.namenode.kerberos.https.principal</name>
    40.         <value>host/${this.namenode.fqdn}@${this.realm}</value>
    41.         <!-- <value>host/_HOST@${this.realm}</value> v1.0.4: NG! -->
    42.         <description>
    43.             The Kerberos principal for the host that the NameNode runs on.
    44.         </description>
    45.     </property>
    46.     <property>
    47.         <name>dfs.namenode.keytab.file</name>
    48.         <value>${this.keytab.dir}/nn.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.secondary.http.port</name>
    56.         <value>50090</value>
    57.         <description>The http port where secondary namenode binds</description>
    58.     </property>
    59.     <property>
    60.         <name>dfs.secondary.http.address</name>
    61.         <value>${this.secondary.namenode.fqdn}:${dfs.secondary.http.port}</value>
    62.         <description>The http address where secondary namenode binds</description>
    63.     </property>
    64.     <property>
    65.         <name>dfs.secondary.https.port</name>
    66.         <value>50495</value>
    67.         <description>The https port where secondary namenode binds</description>
    68.     </property>
    69.     <property>
    70.         <name>dfs.secondary.https.address</name>
    71.         <value>${this.secondary.namenode.fqdn}:${dfs.secondary.https.port}</value>
    72.         <description>The https address where secondary namenode binds</description>
    73.     </property>
    74.     <property>
    75.         <name>dfs.secondary.namenode.kerberos.principal</name>
    76.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    77.         <!-- <value>hdfs/_HOST@${this.realm}</value> v1.0.4: NG! -->
    78.         <description>
    79.             Kerberos principal name for the secondary NameNode.
    80.         </description>
    81.     </property>
    82.     <property>
    83.         <name>dfs.secondary.namenode.kerberos.https.principal</name>
    84.         <value>host/${this.secondary.namenode.fqdn}@${this.realm}</value>
    85.         <!-- <value>host/_HOST@${this.realm}</value> v1.0.4: NG! -->
    86.         <description>
    87.             The Kerberos principal for the host that the secondary NameNode
    88.             runs on.
    89.         </description>
    90.     </property>
    91.     <property>
    92.         <name>dfs.secondary.namenode.keytab.file</name>
    93.         <value>${this.keytab.dir}/cn.keytab</value>
    94.         <description>
    95.             Combined keytab file containing the namenode service and host
    96.             principals.
    97.         </description>
    98.     </property>
    99.     <property>
    100.         <name>dfs.block.access.token.enable</name>
    101.         <value>true</value>
    102.         <description>
    103.             If "true", access tokens are used as capabilities for accessing
    104.             datanodes.
    105.             If "false", no access tokens are checked on accessing datanodes.
    106.         </description>
    107.     </property>
    108.     <property>
    109.         <name>dfs.datanode.kerberos.principal</name>
    110.         <value>hdfs/localhost@${this.realm}</value>
    111.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    112.         <description>
    113.             The Kerberos principal that the DataNode runs as. "_HOST" is
    114.             replaced by the real host name.
    115.         </description>
    116.     </property>
    117.     <property>
    118.         <name>dfs.datanode.keytab.file</name>
    119.         <value>${this.keytab.dir}/dn.keytab</value>
    120.         <description>
    121.             The filename of the keytab file for the DataNode.
    122.         </description>
    123.     </property>
    1. note.png SecondaryNameNodeのバグらしく、チェックポイント実行時に構築されるpost URLのmachineパラメータに(dfs.secondary.https.address ではなく)dfs.secondary.http.address のアドレス(デフォルト値が 0.0.0.0:50090)を設定してしまっており、エラーになります。これを回避するため、dfs.secondary.http.address も明示的に設定します(設定の対称性を重視し、dfs.http.address も明示的に追加しています)。
      1. エラー時のSecondaryNameNodeのログ
        1. 2013-04-16 18:26:33,851 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint:
        2. 2013-04-16 18:26:33,851 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: java.io.FileNotFoundException:
        3.  https://localhost:50470/getimage?putimage=1&port=50495&machine=0.0.0.0&token=-32:72619603:0:1366096482000:1366096163699
        4. at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1623)
        5. at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
        6. at org.apache.hadoop.hdfs.server.namenode.TransferFsImage.getFileClient(TransferFsImage.java:160)
        7. at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.putFSImage(SecondaryNameNode.java:377)
        8. at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:418)
        9. at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doWork(SecondaryNameNode.java:312)
        10. at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$2.run(SecondaryNameNode.java:270)
        11. at java.security.AccessController.doPrivileged(Native Method)
        12. at javax.security.auth.Subject.doAs(Subject.java:356)
        13. at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1103)
        14. at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.run(SecondaryNameNode.java:267)
        15. at java.lang.Thread.run(Thread.java:722)
      2. エラー時のNameNodeのログ
        1. 2013-04-16 18:32:10,423 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException
        2.  as:host/localhost@LOCALDOMAIN cause:java.io.IOException: Can't get service ticket for: host/0.0.0.0
        3. 2013-04-16 18:32:10,424 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException
        4.  as:host/localhost@LOCALDOMAIN cause:java.io.IOException: Can't get service ticket for: host/0.0.0.0
        5. 2013-04-16 18:32:10,431 WARN org.mortbay.log: /getimage: java.io.IOException: GetImage failed. java.io.IOException:
        6.  Can't get service ticket for: host/0.0.0.0
        7. at org.apache.hadoop.security.SecurityUtil.fetchServiceTicket(SecurityUtil.java:168)
        8. at org.apache.hadoop.hdfs.server.namenode.TransferFsImage.getFileClient(TransferFsImage.java:158)
        9. at org.apache.hadoop.hdfs.server.namenode.GetImageServlet$1$1.run(GetImageServlet.java:88)
        10. at org.apache.hadoop.hdfs.server.namenode.GetImageServlet$1$1.run(GetImageServlet.java:85)
        11. at java.security.AccessController.doPrivileged(Native Method)
        12. at javax.security.auth.Subject.doAs(Subject.java:415)
        13. ...
      3. 回避設定後のSecondaryNameNodeのログ
        1. 2013-04-18 18:42:49,482 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode:
        2.  Posted URL localhost:50470putimage=1&port=50495&machine=localhost&token=-32:72619603:0:1366249367000:1366249052908
        3. 2013-04-18 18:42:50,269 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode:
        4.  Checkpoint done. New Image Size: 67273
  3. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>this.jobtracker.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-jt.${this.domain}</value> -->
    5.     </property>
    6.     <property>
    7.         <name>this.jobhistory.fqdn</name>
    8.         <value>localhost</value>
    9.         <!-- <value>${this.cluster.name}-jt.${this.domain}</value> -->
    10.         <!-- <value>${this.cluster.name}-jh.${this.domain}</value> -->
    11.     </property>
    12.  
    13.     <property>
    14.         <name>mapred.job.tracker</name>
    15.         <value>${this.jobtracker.fqdn}:9001</value>
    16.     </property>
    17.     <property>
    18.         <name>mapred.acls.enabled</name>
    19.         <value>true</value>
    20.     </property>
    21.     <property>
    22.         <name>mapreduce.cluster.administrators</name>
    23.         <value> mapred</value>
    24.     </property>
    25.     <property>
    26.         <name>mapreduce.jobtracker.kerberos.principal</name>
    27.         <value>mapred/_HOST@${this.realm}</value>
    28.         <!-- _HOST is replaced with the mapred.job.tracker's host name -->
    29.         <!-- <value>mapred/${this.jobtracker.fqdn}@${this.realm}</value> -->
    30.     </property>
    31.     <property>
    32.         <name>mapreduce.jobtracker.keytab.file</name>
    33.         <value>${this.keytab.dir}/jt.keytab</value>
    34.     </property>
    35.     <property>
    36.         <name>mapreduce.tasktracker.kerberos.principal</name>
    37.         <value>mapred/localhost@${this.realm}</value>
    38.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    39.     </property>
    40.     <property>
    41.         <name>mapreduce.tasktracker.keytab.file</name>
    42.         <value>${this.keytab.dir}/tt.keytab</value>
    43.     </property>
  4. ${HADOOP_HOME}/conf/mapred-queue-acls.xml: defaultキューのジョブ実行権限と管理権限を設定します。
    1. <property>
    2.   <name>mapred.queue.default.acl-submit-job</name>
    3.   <value>*</value>
    4.   <!-- <value> </value> -->
    5.   <description> Comma separated list of user and group names that are allowed
    6.     to submit jobs to the 'default' queue. The user list and the group list
    7.     are separated by a blank. For e.g. user1,user2 group1,group2.
    8.     If set to the special value '*', it means all users are allowed to
    9.     submit jobs. If set to ' '(i.e. space), no user will be allowed to submit
    10.     jobs.
    11.  
    12.     It is only used if authorization is enabled in Map/Reduce by setting the
    13.     configuration property mapred.acls.enabled to true.
    14.  
    15.     Irrespective of this ACL configuration, the user who started the cluster and
    16.     cluster administrators configured via
    17.     mapreduce.cluster.administrators can submit jobs.
    18.   </description>
    19. </property>
    20. <property>
    21.   <name>mapred.queue.default.acl-administer-jobs</name>
    22.   <value> hadoop,gridops</value>
    23.   <!-- <value> </value> -->
    24.   <description> Comma separated list of user and group names that are allowed
    25.     to view job details, kill jobs or modify job's priority for all the jobs
    26.     in the 'default' queue. The user list and the group list
    27.     are separated by a blank. For e.g. user1,user2 group1,group2.
    28.     If set to the special value '*', it means all users are allowed to do
    29.     this operation. If set to ' '(i.e. space), no user will be allowed to do
    30.     this operation.
    31.  
    32.     It is only used if authorization is enabled in Map/Reduce by setting the
    33.     configuration property mapred.acls.enabled to true.
    34.  
    35.     Irrespective of this ACL configuration, the user who started the cluster and
    36.     cluster administrators configured via
    37.     mapreduce.cluster.administrators can do the above operations on all the jobs
    38.     in all the queues. The job owner can do all the above operations on his/her
    39.     job irrespective of this ACL configuration.
    40.   </description>
    41. </property>
  5. ${HADOOP_HOME}/conf/hadoop-policy.xml
    1.   <property>
    2.     <name>security.refresh.policy.protocol.acl</name>
    3.     <value>hdfs,mapred hadoop</value>
    4.     <!-- <value>*</value> -->
    5.     <description>ACL for RefreshAuthorizationPolicyProtocol, used by the
    6.     dfsadmin and mradmin commands to refresh the security policy in-effect.
    7.     The ACL is a comma-separated list of user and group names. The user and
    8.     group list is separated by a blank. For e.g. "alice,bob users,wheel".
    9.     A special value of "*" means all users are allowed.</description>
    10.   </property>
    11.   <property>
    12.     <name>security.admin.operations.protocol.acl</name>
    13.     <value>hdfs,mapred hadoop</value>
    14.     <!-- <value>*</value> -->
    15.     <description>ACL for AdminOperationsProtocol, used by the mradmins commands
    16.     to refresh queues and nodes at JobTracker. The ACL is a comma-separated list of
    17.     user and group names. The user and group list is separated by a blank.
    18.     For e.g. "alice,bob users,wheel". A special value of "*" means all users are
    19.     allowed.</description>
    20.   </property>

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. Hadoopに同梱されている jsvc が不足、または環境に合致していない場合がありますので、パッケージインストールします。
    $ sudo apt-get install jsvc
    $ cd $HADOOP_HOME
    $ sudo ln -s /usr/bin/jsvc libexec/jsvc.i386
    1. debian.pngredhat.pngDebianやRPMパッケージで適切なjsvcがインストールされる場合には、この作業は必要ありません。
  2. ${HADOOP_HOME}/conf/hadoop-env.sh にセキュアDataNodeの設定を追加します。jsvc が依存する Commons Daemonライブラリについては、(同梱されているものではなく)先程パッケージインストールしたものを最初に参照するようにCLASSPATHを設定します。
    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. # Extra Java CLASSPATH elements.  Optional.
    5. if [ x"$HADOOP_CLASSPATH" = x ]; then
    6.     export HADOOP_CLASSPATH=/usr/share/java/commons-daemon.jar
    7. else
    8.     # for Hive and HCatalog
    9.     export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/share/java/commons-daemon.jar
    10. fi
    11. export HADOOP_USER_CLASSPATH_FIRST=true
    1. debian.pngredhat.pngDebianやRPMパッケージで適切なjsvcがインストールされる場合には、最後の HADOOP_CLASSPATHHADOOP_USER_CLASSPATH_FIRST の設定は必要ありません。
  3. ${HADOOP_HOME}/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. hdfsユーザではなく、rootDataNodeを起動させます。起動後、デーモンのオーナはhdfsにスイッチされます。
    $ sudo ./bin/hadoop-daemon.sh start datanode
    1. debian.pngDebianパッケージの場合には、serviceコマンドではなく直接起動スクリプトで起動させます。
      $ sudo /etc/init.d/hadoop-datanode start
    2. redhat.pngRPMパッケージの場合には、通常通りserviceコマンドで起動させます。
      $ sudo service hadoop-datanode start

ユーザ権限でのタスクプロセス起動(tux.pngLinuxTaskController?

  1. ソースパッケージをダウンロードし、環境に合わせて LinuxTaskController? をビルドし配備します(info.pngビルド環境の構築については、Hadoopのビルドをご参照ください)。同梱の LinuxTaskController? は、固定で /etc/hadoop/taskcontroller.cfg を参照しますので、ビルドし直した方が無難でしょう。実行ファイルには、TaskTrackerの起動ユーザのみが所属するグループ(mapred)についてsetgid属性を付与します。
    [for Debian] $ sudo apt-get install ant build-essential autoconf libtool
    [for CentOS] $ sudo yum install     ant gcc-c++ make autoconf automake libtool
    ...
    $ tar xvzf hadoop-1.0.4.tar.gz
    $ cd hadoop-1.0.4
    $ ant task-controller -Dhadoop.conf.dir=${HADOOP_HOME}/conf
    ...
    $ sudo mv ${HADOOP_HOME}/bin/task-controller ${HADOOP_HOME}/bin/task-controller.dist
    $ sudo cp build/hadoop-1.0.4-SNAPSHOT/bin/task-controller ${HADOOP_HOME}/bin/
    $ cd ${HADOOP_HOME}
    $ sudo chown root:mapred bin/task-controller 
    $ sudo chmod 6050 bin/task-controller
    1. note.pngi386環境でのビルド】そのままではビルドに失敗しますので、configure.ac の中の AC_SYS_LARGEFILE をコメントアウトする必要があります(MAPREDUCE-2178: ac-sys-largefile.patch)。
      $ cat src/c++/task-controller/configure.ac
      ...
      AC_INIT(linux-task-controller, 1.0.0, mapreduce-dev@hadoop.apache.org)
      AC_GNU_SOURCE
      #AC_SYS_LARGEFILE
      
      AM_INIT_AUTOMAKE([subdir-objects foreign no-dist])
      ...
    2. note.pngx86_64版のredhat.pngRPM、debian.pngDebianパッケージ】パッケージインストールしたままではtask-controllerのパーミッションが適切ではありませんので、以下のように修正します。
      $ ls -l /usr/bin/task-controller
      -rwxr-xr-x 1 root root 63374 2012-05-09 05:39 /usr/bin/task-controller
      $ sudo chown root:mapred /usr/bin/task-controller
      $ sudo chmod 6050 /usr/bin/task-controller
      $ ls -l /usr/bin/task-controller
      ---Sr-s--- 1 root mapred 63374 2012-05-09 05:39 /usr/bin/task-controller
      1. さらにredhat.pngRPMパッケージではプライベートグループ mapred が自動追加されないため、手動で追加します。
        $ sudo chown root:mapred /usr/bin/task-controller
        chown: `root:mapred': invalid group
        $ id mapred
        uid=202(mapred) gid=123(hadoop) groups=123(hadoop)
        $ sudo /usr/sbin/groupadd -g 202 mapred
        $ sudo /usr/sbin/usermod -G mapred mapred
        $ id mapred
        uid=202(mapred) gid=123(hadoop) groups=123(hadoop),202(mapred)
        $ sudo chown root:mapred /usr/bin/task-controller
        $ sudo chmod 6050 /usr/bin/task-controller
    3. note.pngi386版のredhat.pngRPM、debian.pngDebianパッケージ】誤ってx86_64版のバイナリが同梱されていますので、上記と同様にソースからビルドして配備します。
      $ ls -l /usr/bin/task-controller 
      -rwxr-xr-x 1 root root 63374 2012-05-09 05:20 /usr/bin/task-controller
      $ file /usr/bin/task-controller 
      /usr/bin/task-controller: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
      dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
      $ sudo cp /usr/bin/task-controller /usr/bin/task-controller.dist
      ...
      $ sudo cp build/hadoop-1.0.4-SNAPSHOT/bin/task-controller /usr/bin/task-controller
      $ file /usr/bin/task-controller
      /usr/bin/task-controller: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
      dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
      $ sudo chown root:mapred /usr/bin/task-controller 
      $ sudo chmod 6050 /usr/bin/task-controller
  2. LinuxTaskController? の設定ファイル(${HADOOP_HOME}/conf/taskcontroller.cfg)を ${HADOOP_HOME}/conf/mapred-site.xml と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。
    1. #configured value of mapred.local.dir. It can be a list of comma separated paths.
    2. mapred.local.dir=/grid/vol/0/var/lib/mapred/local,/grid/vol/1/var/lib/mapred/local
    3. #configured value of hadoop.log.dir.
    4. hadoop.log.dir=/grid/vol/0/var/log/mapred
    5. #sleep time before sig kill is to be sent to process group after sigterm is sent. Should be in seconds
    6. mapred.tasktracker.tasks.sleeptime-before-sigkill=5000
    7. mapreduce.tasktracker.group=mapred
    8. #min.user.id=1000    # default
    $ sudo chown root:root conf/taskcontroller.cfg
    $ sudo chmod 0400 conf/taskcontroller.cfg
    1. centos.pngCentOSでは一般ユーザのuidは通常500から振られるため、taskcontroller.cfgのmin.user.id の設定を500に引き下げることをお忘れなく。
      1. #min.user.id=1000    # default
      2. min.user.id=500    # for CentOS
  3. ${HADOOP_HOME}/conf/mapred-site.xml の設定で、LinuxTaskController? を有効にします。
    1.     <property>
    2.         <name>mapred.task.tracker.task-controller</name>
    3.         <value>org.apache.hadoop.mapred.LinuxTaskController</value>
    4.     </property>

JobHistoryServer?の分離

  • JobTrackerの動作が安定しますので、JobTrackerに組み込まれていたJobHistoryServer?を別デーモンに分離します。JobTrackerとは別ホストで稼働されることも可能です。
  1. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>mapreduce.history.server.embedded</name>
    3.         <value>false</value>
    4.     </property>
    5.     <property>
    6.         <name>mapreduce.history.server.http.address</name>
    7.         <value>${this.jobhistory.fqdn}:19888</value>
    8.     </property>
    9.     <property>
    10.         <name>mapreduce.jobhistory.kerberos.principal</name>
    11.         <value>mapred/${this.jobhistory.fqdn}@${this.realm}</value>
    12.     </property>
    13.     <property>
    14.         <name>mapreduce.jobhistory.keytab.file</name>
    15.         <value>${this.keytab.dir}/jh.keytab</value>
    16.     </property>
  2. mapredユーザでHistoryServer?を起動させます。
    $ sudo -u mapred ./bin/hadoop-daemon.sh start historyserver
    1. debian.pngDebianパッケージの場合には、serviceコマンドではなく直接起動スクリプトで起動させます。
      $ sudo -u mapred /etc/init.d/hadoop-historyserver start
    2. redhat.pngRPMパッケージの場合には、通常通りserviceコマンドで起動させます。
      $ sudo service hadoop-historyserver start

ProxyUser(Secure Impersonation)の設定

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

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

  • 各HadoopサービスのWebコンソールにもKerberos認証によるシングルサインオンでアクセスするため、SPNEGO/Kerberosの設定を行います。
  1. ${HADOOP_HOME}/conf/core-site.xml で設定します。hadoop.http.filter.initializers プロパティに org.apache.hadoop.security.AuthenticationFilterInitializer? を設定し、hadoop.http.authentication.typekerberos にします。note.png今のところサービスプリンシパル設定のためのキーが1セットしかありませんので、(各デーモンでサービスするFQDNが異なるため)ノード毎に設定を変える必要があります。info.png因みに、1.0.xでは特殊変数_HOSTを用いて記述しても展開されませんが、1.1.0-rc2および2.0.0-alpha以降では正しく展開されますので、同一の設定値(HTTP/_HOST@${this.realm})で支障がないようになっています。1.0.xで設定セットを単一に保つ方法については後述しています。編集後に、各デーモンプロセスを再起動し反映させます。
    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</name>
    11.         <value>91d365813d6dd1f4ceafff73f90a9a06</value>
    12.         <!-- the secret string or the path of the secret file -->
    13.     </property>
    14.     <property>
    15.         <name>hadoop.http.authentication.cookie.domain</name>
    16.         <value>${this.domain}</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.         <!-- <value>HTTP/_HOST@${this.realm}</value>
    29.             _HOST N/A!: v1.0, HDP1.2; OK: v2.0, CDH3, CDH4 -->
    30.         <!-- for v1.0, HDP1.2
    31.         <value>HTTP/${this.fqdn}@${this.realm}</value>
    32.         "this".fqdn must be set in the conf/hadoop-env.sh
    33.         or each setting
    34.         <value>HTTP/${this.cluster.name}-nn.${this.domain}@${this.realm}</value>
    35.         <value>HTTP/${this.cluster.name}-cn.${this.domain}@${this.realm}</value>
    36.         <value>HTTP/${this.cluster.name}-jt.${this.domain}@${this.realm}</value>
    37.         <value>HTTP/${this.cluster.name}-jh.${this.domain}@${this.realm}</value>
    38.         <value>HTTP/dn00000.${this.domain}@${this.realm}</value>
    39.         <value>HTTP/dn00001.${this.domain}@${this.realm}</value>
    40.         -->
    41.     </property>
    42.     <property>
    43.         <name>hadoop.http.authentication.kerberos.keytab</name>
    44.         <value>${this.keytab.dir}/HTTP.keytab</value>
    45.     </property>
    1. lightbulb.png【完全分散環境での hadoop.http.authentication.kerberos.principal 設定】Hadoopの運用管理では、どのデーモンにおいても同一の設定セットを使用し、各デーモン毎に設定ファイルセットを発散させないというのが鉄則です。以下の方法で、1.0.xにおいても hadoop.http.authentication.kerberos.principal について同一の設定セットを保つことができます。
      1. ${HADOOP_HOME}/conf/hadoop-env.sh: 残念ながら、hadoop.http.authentication.kerberos.principal は起動パラメータで直接上書きすることができませんので、独自のシステムプロパティ this.fqdn を用意し、各デーモン毎の設定を動的に行えるようにします。
        1. FQDN=`hostname --fqdn`
        2. CLUSTER_NAME='pleiades'
        3. DOMAIN='grid.example.com'
        4. export HADOOP_NAMENODE_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-nn.${DOMAIN} ${HADOOP_NAMENODE_OPTS}"
        5. export HADOOP_SECONDARYNAMENODE_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-cn.${DOMAIN} ${HADOOP_SECONDARYNAMENODE_OPTS}"
        6. export HADOOP_DATANODE_OPTS="-Dthis.fqdn=${FQDN} ${HADOOP_DATANODE_OPTS}"
        7. export HADOOP_JOBTRACKER_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-jt.${DOMAIN} ${HADOOP_JOBTRACKER_OPTS}"
        8. export HADOOP_TASKTRACKER_OPTS="-Dthis.fqdn=${FQDN} ${HADOOP_TASKTRACKER_OPTS}"
      2. ${HADOOP_HOME}/conf/core-site.xml: 設定したシステムプロパティ this.fqdn を参照するようにします。
        1.     <property>
        2.         <name>hadoop.http.authentication.kerberos.principal</name>
        3.         <value>HTTP/${this.fqdn}@${this.realm}</value>
        4.     </property>
  2. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS - ※1.0 では提供されていません。
  2. WebHDFS

テスト

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

参考リソース

  1. 設定ファイル一式
  2. (KSSL Deployments Only) Problem 12: Due to a bug in JDK 6, Kerberos-enabled SSL (KSSL) does not work.
    1. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6946669

添付ファイル: filetest_users.ldif 413件 [詳細] filehadoop_users.ldif 427件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-10 (日) 15:32:54 (3517d)