Hadoop >

目次

概要

  • Apache ZooKeeper は、信頼性の高い分散協調システムであり、分散環境における、設定情報管理、命名、グルーピングおよび同期等のサービスの構築を容易にします。
  • ZooKeeper を利用したプロダクトには、Apache Hadoopをはじめ、Apache HBase、Apache Giraph、Apache Hamaなどがあります。

セットアップ

  1. Zookeeper の実行モードには、単一デーモンのスタンドアロン(standalone)モードと、複数ノードの複数デーモンによってデータが複製される複製(replicated)モードがあります。前者はもちろん開発環境に最適であり、後者は本格的な実行環境となります。
  2. この他に設定がやや煩雑になりますが、単一ノード(通常localhost)で複数のデーモンを起動させ、疑似的に複製モードで実行させることもできます。このモードは、Zookeeperの動作を理解するのに役立つでしょう。
  3. 以下の説明では、Zookeeperのインストール先(ZOOKEEPER_PREFIX)を /grid/usr/zookeeper としています。

共通

  1. 起動ユーザを追加します。note.pnghadoopグループへの所属は、疑似分散環境でHadoopと同時に動作させる場合の便宜のためです。完全分散環境では不要です。
    $ sudo adduser --shell /bin/sh --uid 10050 --disabled-password zookeeper
    $ sudo usermod -G hadoop zookeeper
  2. 配布アーカイブをダウンロードし、適当なところに展開します。
    $ sudo tar xvzf zookeeper-3.4.5.tar.gz -C /grid/usr
    $ cd /grid/usr
    $ sudo ln -s zookeeper-3.4.5 zookeeper
    $ sudo chown -R root:root zookeeper-3.4.5

スタンドアロンモード

  • lightbulb.png参考までに、これはここで説明しているスタンドアロンモード環境を構築するChefレシピ(ロール)です。
  1. 編集する設定セットは既存の ${ZOOKEEPER_PREFIX}/conf 以下でもよいのですが、後ほどの疑似複製モードの検証が行いやすいように、スタンドアロンモード用の設定セット(conf.standalone/)を別に用意します。
    $ cd $ZOOKEEPER_PREFIX
    $ sudo cp -R conf conf.standalone
  2. ${ZOOKEEPER_PREFIX}/conf.standalone/zookeeper-env.sh を作成し、以下の要領で環境変数を設定します。
    1. #export JAVA_HOME=/usr/lib/jvm/java-6-sun
    2. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    3. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
    4. export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
    5.  
    6. export ZOO_LOG_DIR=/grid/vol/0/var/log/zookeeper/standalone
  3. 次に、${ZOOKEEPER_PREFIX}/conf.standalone/zoo.cfg で主要な設定を行います。スタンドアロンモードでは、Zookeeperアンサンブルの定義は必要ありません。
    $ sudo cp ${ZOOKEEPER_PREFIX}/conf.standalone/zoo_sample.cfg ${ZOOKEEPER_PREFIX}/conf.standalone/zoo.cfg
    1. # The number of milliseconds of each tick
    2. tickTime=2000
    3. # The number of ticks that the initial
    4. # synchronization phase can take
    5. initLimit=10
    6. # The number of ticks that can pass between
    7. # sending a request and getting an acknowledgement
    8. syncLimit=5
    9. # the directory where the snapshot is stored.
    10. # do not use /tmp for storage, /tmp here is just
    11. # example sakes.
    12. #dataDir=/tmp/zookeeper
    13. dataDir=/grid/vol/0/var/lib/zookeeper/standalone
    14. #dataLogDir=/grid/vol/1/var/lib/zookeeper/standalone
    15. # the port at which the clients will connect
    16. clientPort=2181
    17. #
    18. # Be sure to read the maintenance section of the
    19. # administrator guide before turning on autopurge.
    20. #
    21. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    22. #
    23. # The number of snapshots to retain in dataDir
    24. #autopurge.snapRetainCount=3
    25. # Purge task interval in hours
    26. # Set to "0" to disable auto purge feature
    27. #autopurge.purgeInterval=1
  4. 必要なディレクトリを用意します。
    $ sudo mkdir -p /grid/vol/0/var/{lib,log}/zookeeper/standalone
    $ sudo chown -R zookeeper:zookeeper /grid/vol/0/var/{lib,log}/zookeeper
  5. スタンドアロンモードでは、デーモンの識別子(${dataDir}/myid)の設定は不要です。
  6. デーモンを起動させます。note.pngzkServer.sh の第2引数に設定ファイル(zoo.cfg)のパスを与えて起動させることも可能ですが、設定セットを別に用意している場合には問題がありますので、以下の要領で起動させます。
    $ sudo -u zookeeper sh -c 'export ZOOCFGDIR=/grid/usr/zookeeper/conf.standalone;./bin/zkServer.sh start'
  7. 動作を確認します。
    $ ${ZOOKEEPER_PREFIX}/bin/zkCli.sh -server localhost:2181
    ...
    [zk: localhost:2181(CONNECTED) 0] ls /zookeeper
    [quota]

疑似複製(replicated)モード

  • lightbulb.png参考までに、これはここで説明している疑似複製環境を構築するChefレシピ(ロール)です。
  1. 起動させるデーモンの数だけ設定セットを用意しますが、通常の最小構成は3デーモンによるZookeeperアンサンブルです。まず最初のデーモン用の設定セット(${ZOOKEEPER_PREFIX}/conf.0)を編集します。
    $ cd $ZOOKEEPER_PREFIX
    $ sudo cp -R conf conf.0
  2. ${ZOOKEEPER_PREFIX}/conf.0/zookeeper-env.sh を作成し、以下の要領で環境変数を設定します。
    1. #export JAVA_HOME=/usr/lib/jvm/java-6-sun
    2. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    3. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
    4. export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
    5.  
    6. export ZOO_LOG_DIR=/grid/vol/0/var/log/zookeeper/0
  3. 次に、${ZOOKEEPER_PREFIX}/conf.0/zoo.cfg で主要な設定を行います。複製モードでは、server.x=[hostname]:nnnnn[:nnnnn] のリストでZookeeperアンサンブルを定義します。疑似複製モードでは、同一ノードで複数のデーモンを起動させるためそれぞれのサービスポートをインクリメントして変えています。
    $ sudo cp ${ZOOKEEPER_PREFIX}/conf.0/zoo_sample.cfg ${ZOOKEEPER_PREFIX}/conf.0/zoo.cfg
    1. # The number of milliseconds of each tick
    2. tickTime=2000
    3. # The number of ticks that the initial
    4. # synchronization phase can take
    5. initLimit=10
    6. # The number of ticks that can pass between
    7. # sending a request and getting an acknowledgement
    8. syncLimit=5
    9. # the directory where the snapshot is stored.
    10. # do not use /tmp for storage, /tmp here is just
    11. # example sakes.
    12. #dataDir=/tmp/zookeeper
    13. dataDir=/grid/vol/0/var/lib/zookeeper/0
    14. #dataLogDir=/grid/vol/1/var/lib/zookeeper/0
    15. # the port at which the clients will connect
    16. clientPort=2180
    17. #
    18. # Be sure to read the maintenance section of the
    19. # administrator guide before turning on autopurge.
    20. #
    21. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    22. #
    23. # The number of snapshots to retain in dataDir
    24. #autopurge.snapRetainCount=3
    25. # Purge task interval in hours
    26. # Set to "0" to disable auto purge feature
    27. #autopurge.purgeInterval=1
    28.  
    29. # Pseudo ensemble mode on single host
    30. server.0=localhost:2888:3888
    31. server.1=localhost:2889:3889
    32. server.2=localhost:2890:3890
    33.  
    34. #server.0=zk00.grid.example.com:2888:3888
    35. #server.1=zk01.grid.example.com:2888:3888
    36. #server.2=zk02.grid.example.com:2888:3888
  4. 必要なディレクトリを用意します。
    $ sudo mkdir -p /grid/vol/0/var/{lib,log}/zookeeper/{0..2}
    $ sudo chown -R zookeeper:zookeeper /grid/vol/0/var/{lib,log}/zookeeper
  5. その他のデーモンの設定セットを用意し、必要な箇所を編集します。以下の通り、各デーモンにあわせて、dataDir、dataLogDir?、clientPort、ログ出力ディレクトリ等を変更します。
    1. $ diff -u conf.0 conf.1
    2. diff -u conf.0/zoo.cfg conf.1/zoo.cfg
    3. --- conf.0/zoo.cfg      2013-04-22 19:28:25.000000000 +0900
    4. +++ conf.1/zoo.cfg      2013-04-22 19:28:25.000000000 +0900
    5. @@ -10,10 +10,10 @@
    6.  # do not use /tmp for storage, /tmp here is just
    7.  # example sakes.
    8.  #dataDir=/tmp/zookeeper
    9. -dataDir=/grid/vol/0/var/lib/zookeeper/0
    10. -#dataLogDir=/grid/vol/1/var/lib/zookeeper/0
    11. +dataDir=/grid/vol/0/var/lib/zookeeper/1
    12. +#dataLogDir=/grid/vol/1/var/lib/zookeeper/1
    13.  # the port at which the clients will connect
    14. -clientPort=2180
    15. +clientPort=2181
    16.  #
    17.  # Be sure to read the maintenance section of the
    18.  # administrator guide before turning on autopurge.
    19. diff -u conf.0/zookeeper-env.sh conf.1/zookeeper-env.sh
    20. --- conf.0/zookeeper-env.sh     2013-04-22 19:28:25.000000000 +0900
    21. +++ conf.1/zookeeper-env.sh     2013-04-22 19:28:25.000000000 +0900
    22. @@ -4,4 +4,4 @@
    23.  #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
    24.  export JAVA_HOME=/usr/local/jvm/java-6-ora
    25.  
    26. -export ZOO_LOG_DIR=/grid/vol/0/var/log/zookeeper/0
    27. +export ZOO_LOG_DIR=/grid/vol/0/var/log/zookeeper/1
  6. 各デーモンの識別子(整数)を設定します。
    $ sudo -u zookeeper sh -c 'echo 0 > /grid/vol/0/var/lib/zookeeper/0/myid'
    $ sudo -u zookeeper sh -c 'echo 1 > /grid/vol/0/var/lib/zookeeper/1/myid'
    $ sudo -u zookeeper sh -c 'echo 2 > /grid/vol/0/var/lib/zookeeper/2/myid'
  7. 各デーモンを起動させます。
    $ sudo -u zookeeper sh -c 'export ZOOCFGDIR=/grid/usr/zookeeper/conf.0;./bin/zkServer.sh start'
    $ sudo -u zookeeper sh -c 'export ZOOCFGDIR=/grid/usr/zookeeper/conf.1;./bin/zkServer.sh start'
    $ sudo -u zookeeper sh -c 'export ZOOCFGDIR=/grid/usr/zookeeper/conf.2;./bin/zkServer.sh start'
  8. 動作を確認します。
    $ ${ZOOKEEPER_PREFIX}/bin/zkCli.sh -server localhost:2181
    ...
    [zk: localhost:2181(CONNECTED) 0] ls /zookeeper
    [quota]

完全複製(replicated)モード

  • lightbulb.png参考までに、これはここで説明している完全複製モード環境を構築するChefレシピ(ロール)です。
  1. 通常の最小構成(過半数議決のため奇数台)は3ノードによるZookeeperアンサンブルです。基本的にどのノードも同じ内容の設定セット(${ZOOKEEPER_PREFIX}/conf)を用います。
  2. ${ZOOKEEPER_PREFIX}/conf/zookeeper-env.sh を作成し、以下の要領で環境変数を設定します。
    1. #export JAVA_HOME=/usr/lib/jvm/java-6-sun
    2. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    3. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
    4. export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
    5.  
    6. export ZOO_LOG_DIR=/grid/vol/0/var/log/zookeeper
  3. 次に、${ZOOKEEPER_PREFIX}/conf/zoo.cfg で主要な設定を行います。複製モードでは、server.x=[hostname]:nnnnn[:nnnnn] のリストでZookeeperアンサンブルを定義します。完全複製モードでは、疑似分散とは異なりそれぞれのノードでデーモンを起動させるため、サービスポートは同一で構いません。パフォーマンスアップのために、dataLogDir? を別のディスクに振り分けます。/grid/vol/{0,1} がそれぞれ別のディスクをマウントしている想定です。
    $ sudo cp ${ZOOKEEPER_PREFIX}/conf/zoo_sample.cfg ${ZOOKEEPER_PREFIX}/conf/zoo.cfg
    1. # The number of milliseconds of each tick
    2. tickTime=2000
    3. # The number of ticks that the initial
    4. # synchronization phase can take
    5. initLimit=10
    6. # The number of ticks that can pass between
    7. # sending a request and getting an acknowledgement
    8. syncLimit=5
    9. # the directory where the snapshot is stored.
    10. # do not use /tmp for storage, /tmp here is just
    11. # example sakes.
    12. #dataDir=/tmp/zookeeper
    13. dataDir=/grid/vol/0/var/lib/zookeeper
    14. dataLogDir=/grid/vol/1/var/lib/zookeeper
    15. # the port at which the clients will connect
    16. clientPort=2180
    17. #
    18. # Be sure to read the maintenance section of the
    19. # administrator guide before turning on autopurge.
    20. #
    21. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    22. #
    23. # The number of snapshots to retain in dataDir
    24. #autopurge.snapRetainCount=3
    25. # Purge task interval in hours
    26. # Set to "0" to disable auto purge feature
    27. #autopurge.purgeInterval=1
    28.  
    29. # Pseudo ensemble mode on single host
    30. #server.0=localhost:2888:3888
    31. #server.1=localhost:2889:3889
    32. #server.2=localhost:2890:3890
    33.  
    34. server.0=zk00.grid.example.com:2888:3888
    35. server.1=zk01.grid.example.com:2888:3888
    36. server.2=zk02.grid.example.com:2888:3888
  4. 必要なディレクトリを用意します。
    $ sudo mkdir -p /grid/vol/0/var/{lib,log}/zookeeper
    $ sudo chown -R zookeeper:zookeeper /grid/vol/0/var/{lib,log}/zookeeper
    $ sudo mkdir -p /grid/vol/1/var/lib/zookeeper
    $ sudo chown -R zookeeper:zookeeper /grid/vol/1/var/lib/zookeeper
  5. 各デーモンの識別子(整数)を設定します。
    zk00 $ sudo -u zookeeper sh -c 'echo 0 > /grid/vol/0/var/lib/zookeeper/myid'
    zk01 $ sudo -u zookeeper sh -c 'echo 1 > /grid/vol/0/var/lib/zookeeper/myid'
    zk02 $ sudo -u zookeeper sh -c 'echo 2 > /grid/vol/0/var/lib/zookeeper/myid'
  6. 各デーモンを起動させます。
    * $ sudo -u zookeeper ./bin/zkServer.sh start
  7. 動作を確認します。
    $ ${ZOOKEEPER_PREFIX}/bin/zkCli.sh -server zk01.grid.example.com:2181
    ...
    [zk: zk01.grid.example.com:2181(CONNECTED) 0] ls /zookeeper
    [quota]

セキュア設定

Chefレシピ

Java

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

Kerberos認証環境

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

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

  1. 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。
    $ sudo mkdir -p /grid/etc/keytabs/localhost
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey zookeeper/localhost
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/localhost/localhost.keytab zookeeper/localhost
  2. keytabファイルの内容を確認し、適切なパーミッションを設定します。完全複製モードの場合と設定に統一感が出るようにシンボリックリンクを張っておきます。
    $ sudo chown root:hadoop localhost.keytab
    $ sudo chmod 440         localhost.keytab
    $ cd /grid/etc/keytabs/localhost
    $ sudo ln -s localhost.keytab zk.keytab

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

  • 例示環境の詳細については、Hadoop完全分散モデル環境をご参照ください。Zookeeperはその動作の性質上、データセンタを跨いで広範囲に配備されることは推奨されませんが、一つのデータセンタ(以下の例では、colo00)に一つのZookeeperアンサンブルを構築すれば十分でしょう。
  1. 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。
    kadmin.local:  add_principal -randkey zookeeper/zk00.grid.example.com
    WARNING: no policy specified for zookeeper/zk00.grid.example.com@GRID.EXAMPLE.COM; defaulting to no policy
    Principal "zookeeper/zk00.grid.example.com@GRID.EXAMPLE.COM" created.
    kadmin.local:  add_principal -randkey zookeeper/zk01.grid.example.com
    ...
    kadmin.local:  add_principal -randkey zookeeper/zk02.grid.example.com
    ...
    $ sudo mkdir -p /grid/etc/keytabs/colo00
    $ sudo kadmin.local
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/colo00/zk00.keytab -p zookeeper/zk00.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/colo00/zk01.keytab -p zookeeper/zk01.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/colo00/zk02.keytab -p zookeeper/zk02.grid.example.com
    ...
  2. 各ノードに必要なkeytabファイルを配備します。keytabファイル名については、設定の便宜のため配備後、zk.keytab にリネーム(あるいはシンボリックリンク)します。keytabファイルの参照権限は、(LDAP認可環境セットアップ後に)デーモンプロセスの起動ユーザ(zookeeper)にのみ付与します。
     *:$ cd /grid/etc/keytabs/colo00
    zk:$ sudo chown zookeeper:zookeeper zk.keytab
    zk:$ sudo chmod 400                 zk.keytab

LDAP認可環境(オプション)

  1. Zookeeperの運用に必要なアカウントは起動ユーザ(zookeeper)のみですので、LDAPとの連携は必ずしも必要ではありません。
  2. ただ、Grid環境全ノードのアカウントをLDAPで集中管理している場合には、LDAPとの連携が自然でしょう。構築方法の詳細については、LDAPセットアップforHadoopをご参照ください。

Zookeeperサーバ間相互認証

note.pngこれまでのところ、Zookeeperサーバ間のセキュアな相互認証機構はまだ実装されていません(ZOOKEEPER-1045)。したがって、何らかのネットワーク的な防御措置が必要となるでしょう。

クライアント、サーバ相互認証(SASL/Kerberos)

サーバの設定

  1. ${ZOOKEEPER_PREFIX}/conf/java.env を作成し、JAAS(Java Authentication and Authorization Service)設定ファイルの参照先を設定します。システムプロパティ this.fqdn を追加しているのは、それぞれのノードでFQDNが別となる完全分散環境用の設定です。
    1. FQDN=`hostname --fqdn`
    2.  
    3. export JVMFLAGS="-Dthis.fqdn=${FQDN} -Djava.security.auth.login.config=/grid/usr/zookeeper/conf/jaas.conf"
  2. ${ZOOKEEPER_PREFIX}/conf/jaas.conf を作成します。ここではサーバでの確認用に、Clientブロックも定義しています。完全分散環境では、this.fqdn を参照して設定します。
    1. Server {
    2.     com.sun.security.auth.module.Krb5LoginModule required
    3.         useKeyTab=true
    4.         keyTab="/grid/etc/keytabs/localhost/zk.keytab"
    5.         //keyTab="/grid/etc/keytabs/colo00/zk.keytab"
    6.         storeKey=true
    7.         useTicketCache=false
    8.         principal="zookeeper/localhost@LOCALDOMAIN";
    9.         // for replicated mode.
    10.         /*
    11.         principal="zookeeper/${this.fqdn}@GRID.EXAMPLE.COM";
    12.         principal="zookeeper/zk00.grid.example.com@GRID.EXAMPLE.COM";
    13.         principal="zookeeper/zk01.grid.example.com@GRID.EXAMPLE.COM";
    14.         principal="zookeeper/zk02.grid.example.com@GRID.EXAMPLE.COM";
    15.         */
    16. };
    17. Client {
    18.     com.sun.security.auth.module.Krb5LoginModule required
    19.         useKeyTab=false
    20.         useTicketCache=true
    21.         debug=true;
    22. };
  3. ${ZOOKEEPER_PREFIX}/conf/zoo.cfg にSASL認証プロバイダを追加します。authProvider.X の添字 X はプロバイダの識別子ですので、このサーバで一意でなければなりません。
    1. authProvider.0=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    2. jaasLoginRenew=3600000
    3. kerberos.removeHostFromPrincipal=true
    4. kerberos.removeRealmFromPrincipal=true
    5. # N/A?!
    6. #requireClientAuthScheme=sasl
    7. #allowSaslFailedClients=false
    8. #maintain_connection_despite_sasl_failure=false
    1. オプションですが、ACLの設定を容易にするために(サービス)プリンシパルのインスタンス(ホスト)部とレルムが削除される設定(kerberos.removeHostFromPrincipal?、kerberos.removeRealmFromPrincipal?)を追加します。
    2. note.png認証を強制するため、ドキュメントに散見されるこれら(requireClientAuthScheme?、allowSaslFailedClients?、maintain_connection_despite_sasl_failure)の設定をテストしましたが、(認証に失敗しても接続が継続され)有効ではありませんでした。
      1. ZOOKEEPER-938
      2. Up and Running with Secure Zookeeper
      3. 16.2. SASL Authentication with ZooKeeper
  4. サーバを再起動させ反映させます。

クライアントの設定

  1. サーバの設定とほとんど同様ですが、${ZOOKEEPER_PREFIX}/conf/jaas.conf には、Clientブロックのみを定義します。以下は、kinitによるチケットキャッシュを利用する場合の設定です。一方、アプリケーションがクライアントとなる場合には、サーバの設定と同様に keytab を利用してアクセスするとよいでしょう。
    1. Client {
    2.     com.sun.security.auth.module.Krb5LoginModule required
    3.         useKeyTab=false
    4.         useTicketCache=true
    5.         debug=true;
    6. };
  2. 動作を確認します。
    $ sudo -u alice kinit
    ...
    $ sudo -u alice bin/zkCli.sh -server localhost:2181

参考リソース


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