CDH >

目次

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

  1. CDH4
  2. CDH3 - DEPRECATED

構成の概要と注意点

  • CDH5では、次世代のYARN(Yet Another Resource Negotiator)環境、または従来型のMapReduce? v1実行環境(JobTrackerTaskTracker)のいずれかでセットアップを行います。現時点では、CDH5自体がまだベータリリースですので、プロダクション環境での利用は推奨されていません。
  • 通常、環境に関する設定はデフォルトのままで問題ありませんが、おそらくログ出力先等は出力データ量に応じてカスタマイズする必要があるでしょう。
    • CDH4では、YARNフレームワーク上のMapReduce?アプリケーション(JobHistoryServer?を含む)の環境設定がまだYARNのそれ(/etc/hadoop/conf/yarn-env.sh)を参照していましたが、CDH5では、Apache版(2.0.2以降)と同様に mapred-env.sh に分離されています。
    • ただし、セキュアDataNodeを起動させる場合、hadoop-env.sh 設定ファイル中の $USER 変数が無効となり、HDFSの各デーモン毎に適切な設定を行うことが難しくなっています。
  • 以下の説明では、こちらの推奨ディレクトリ構成例で構築します。また、CDH5での構築推奨環境はYARNになると推測されますので、以下では主にそのYARNのセットアップを行います。

疑似分散モード(シングルノード)

主にYARN(次世代MapReduce?)最新版をセットアップします。 ローカルモードではなく、1機で分散処理環境を起動させます。以下のインスタンスを起動します。

  1. HDFS
    1. プライマリNameNode
    2. セカンダリNameNode
    3. DataNode
  2. YARN
    1. ResourceManager?
    2. NodeManager?
  3. MapReduce?アプリケーション
    1. JobHistoryServer?

CDHの設定ディレクトリは、/etc/hadoop/conf/ です。

Chefレシピ

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

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed.rb: これはデフォルトでは、Apache版のHadoopクラスタを構築するロールです。
    • cake.pnggrid-chef-repo:/roles/test-cdh-on-localhost.rb: CDHでクラスタ構築する場合には、このロールのように run_list に yum-cdh および hadoop-pseudo-distributed ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::cdh レシピは、RPMパッケージを用いてCDHのインストールを行います。
    • さらに、CDH5ではOracle JDKのバージョン要件が7となっていますので、従来のデフォルトのJDK6の設定をオーバーライドするため、java7ロールを追加しています。
    • 参考までに、リソース管理フレームワーク(YARNまたはMRv1)は、node['hadoop']['cdh']['resource_negotiator_framework'] 属性で切り替えます。
      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.     'cdh' => {
      25.       'resource_negotiator_framework' => 'YARN',  # or 'MRv1' (CDH4 only.)
      26.     },
      27.     'HADOOP_CLASSPATH' => '',
      28.     'HADOOP_USER_CLASSPATH_FIRST' => 'false',
      29.     # for 2.0.x only
      30.     'container-executor' => {
      31.       'min.user.id' => '500'
      32.     },
      33.     #'yarn.nodemanager.linux-container-executor.resources-handler.class' \
      34.     #  => 'org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler',
      35.     },
      36.   }
      37. )

ホスト名

  1. Hadoopの各デーモンは起動時に自ホストの名前を参照しますので、疑似分散環境(localhost)で検証する場合には、(必須ではありませんが)一時的に hostname に localhost を設定しておくと無難です。
    $ sudo hostname localhost
  2. hosts ファイルも適切に設定してあることを確認します。
    $ cat /etc/hosts
    127.0.0.1       localhost
    192.168.0.10    this.host.example.com
    ...

LDAP認可環境

  1. シングルノードではOSの静的ファイルによる権限解決で十分ですので、特にLDAPなどをセットアップする必要はありません。

共通

  1. note.pngOracle JDK 7はインストールされている前提です。
  2. CDH5のリポジトリを追加します。
    $ wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
    $ sudo yum --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm
    
    $ sudo rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
    
    $ yum repolist
    ...
    repo id                 repo name                                                status
    base                    CentOS-6 - Base                                          6,381
    cloudera-cdh5           Cloudera's Distribution for Hadoop, Version 5              124
    extras                  CentOS-6 - Extras                                           13
    updates                 CentOS-6 - Updates                                       1,444
    repolist: 7,962
  3. ノード毎に必要なデーモンパッケージ(疑似分散の場合には全て)をインストールします。
    1. HDFS
      $ sudo yum install hadoop-hdfs-{namenode,secondarynamenode,datanode}
    2. YARN(または、次のMapReduce? v1のいずれか)
      $ sudo yum install hadoop-{yarn-{resourcemanager,nodemanager},mapreduce-historyserver}
    3. MapReduce? v1(参考)
      $ sudo yum install hadoop-0.20-mapreduce-{jobtracker,tasktracker}
    4. hdfs、yarn、mapredユーザおよびhadoopグループが自動で追加されます。
      $ id hdfs
      uid=496(hdfs) gid=496(hdfs) groups=496(hdfs),498(hadoop)
      $ id yarn
      uid=497(yarn) gid=497(yarn) groups=497(yarn),498(hadoop)
      $ id mapred
      uid=495(mapred) gid=495(mapred) groups=495(mapred),498(hadoop)
    5. インストール時に各デーモンの自動起動が有効になっていますので、もし運用上、支障があれば無効にします。
      $ chkconfig | grep hadoop
      hadoop-hdfs-datanode	0:off	1:off	2:off	3:on	4:on	5:on	6:off
      hadoop-hdfs-namenode	0:off	1:off	2:off	3:on	4:on	5:on	6:off
      hadoop-hdfs-secondarynamenode	0:off	1:off	2:off	3:on	4:on	5:on	6:off
      hadoop-mapreduce-historyserver	0:off	1:off	2:off	3:on	4:on	5:on	6:off
      hadoop-yarn-nodemanager	0:off	1:off	2:off	3:on	4:on	5:on	6:off
      hadoop-yarn-resourcemanager	0:off	1:off	2:off	3:on	4:on	5:on	6:off
    6. ネイティブライブラリは hadoop パッケージで、jsvc は依存関係にある bigtop-jsvc パッケージで、YARNの container-executor バイナリは hadoop-yarn パッケージ、MapReduce? v1の場合の task-controller バイナリは hadoop-0.20-mapreduce パッケージでそれぞれインストールされます。
  4. alternativesシステムを利用して設定セットを管理します。以下の例では、conf.localhost 設定セットを作成し、有効にしています。
    $ sudo cp -R /etc/hadoop/conf.dist/ /etc/hadoop/conf.localhost
    $ sudo alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.localhost 50
    $ sudo alternatives --display hadoop-conf
    hadoop-conf - status is auto.
     link currently points to /etc/hadoop/conf.localhost
    /etc/hadoop/conf.empty - priority 10
    /etc/hadoop/conf.pseudo - priority 30
    /etc/hadoop/conf.localhost - priority 50
    Current `best' version is /etc/hadoop/conf.localhost.
    • 疑似分散の場合には、以下のように既存の hadoop-conf-pseudo パッケージを利用することも可能ですが、カスタマイズの都合上、この説明では一から設定していきます。
      $ sudo yum install hadoop-conf-pseudo
      ...
      $ rpm -ql hadoop-conf-pseudo
      /etc/hadoop/conf.pseudo
      /etc/hadoop/conf.pseudo/README
      /etc/hadoop/conf.pseudo/core-site.xml
      /etc/hadoop/conf.pseudo/hadoop-env.sh
      /etc/hadoop/conf.pseudo/hadoop-metrics.properties
      /etc/hadoop/conf.pseudo/hdfs-site.xml
      /etc/hadoop/conf.pseudo/log4j.properties
      /etc/hadoop/conf.pseudo/mapred-site.xml
      /etc/hadoop/conf.pseudo/yarn-site.xml
  5. /etc/hadoop/conf/hadoop-env.sh を作成し、環境にあわせて以下のような内容を追加します。$HADOOP_PID_DIR は明示的には設定せず、デフォルト(/var/run/hadoop-hdfs、/var/run/hadoop-0.20-mapreduce)のままにすると良いでしょう。$HADOOP_MAPRED_HOME の設定は、hadoop や yarn コマンドでMapReduce?ジョブを実行する場合に必要となります。note.pngHadoopのログ出力はかなりの量になりますので、ルートファイルシステムが小さい場合には出力先($HADOOP_LOG_DIR)を適切に変更する必要があります。また、そのような場合CDH5では環境変数 $USER が利用できませんので注意が必要です。
    1. # The directory where pid files are stored. /var/run/hadoop-hdfs by default.
    2. #export HADOOP_PID_DIR=/grid/vol/0/var/run/${USER}
    3. # Where log files are stored. /var/log/hadoop-hdfs by default.
    4. #export HADOOP_LOG_DIR=/grid/vol/0/var/log/${USER}
    5. # $USER is N/A in the Secure DataNode
    6. if [ x"$USER" = x'' ]; then
    7.     export HADOOP_LOG_DIR=/grid/vol/0/var/log/hdfs
    8. else
    9.     export HADOOP_LOG_DIR=/grid/vol/0/var/log/${USER}
    10. fi
    11.  
    12. # Note: Secure DataNode settings are N/A -> /etc/default/hadoop-hdfs-datanode
    13. #export HADOOP_SECURE_DN_USER=hdfs
    14. #export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    15. #export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
    16.  
    17. export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
    1. info.pngなお、デフォルト設定は以下のとおりです。info.pngJSVC_HOME の設定値が、/usr/libexec/bigtop-utils から /usr/lib/bigtop-utils に変更されています。
      $ cat /etc/default/hadoop
      ...
      export HADOOP_HOME_WARN_SUPPRESS=true
      export HADOOP_PREFIX=/usr/lib/hadoop
      
      export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec
      export HADOOP_CONF_DIR=/etc/hadoop/conf
      
      export HADOOP_COMMON_HOME=/usr/lib/hadoop
      export HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs
      export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
      export HADOOP_YARN_HOME=/usr/lib/hadoop-yarn
      export JSVC_HOME=/usr/lib/bigtop-utils
  6. データなどを格納するディレクトリを用意します。
    $ sudo mkdir -p /grid/vol/0/var/{lib,log,run}
    $ sudo chown -R root:hadoop /grid/vol/0/var
    $ sudo chmod -R 775         /grid/vol/0/var
  7. 設定ファイル /etc/hadoop/conf/core-site.xml を編集します。文字通り一時作業領域という意味で hadoop.tmp.dir 設定は重要ですので、デフォルト設定を維持しつつ、以下のセットアップでは永続化が必要となるデータの格納領域を明示的に設定変更していきます。
    1. <configuration>
    2.     <property>
    3.         <name>fs.defaultFS</name>
    4.         <value>hdfs://localhost:9000</value>
    5.     </property>
    6.     <property>
    7.         <name>hadoop.tmp.dir</name>
    8.         <value>/tmp/hadoop-${user.name}</value>
    9.     </property>
    10. </configuration>
    1. note.pngポート9000番は、環境によっては php5-fpm でデフォルトで利用されるようです。ご注意ください。

オプションのネイティブライブラリ

  1. libhdfs は、hadoop-libhdfs パッケージでインストールします。
    $ rpm -ql hadoop-libhdfs
    /usr/include/hdfs.h
    /usr/lib64/libhdfs.so
    /usr/lib64/libhdfs.so.0.0.0

HDFS

  1. info.png特に編集する必要はありませんが、デフォルト環境設定は以下のとおりです。$HADOOP_LOG_DIR の設定等を上書きする場合には、/etc/hadoop/conf/hadoop-env.sh で行います。
    $ cat /etc/default/hadoop-hdfs-namenode
    ...
    export HADOOP_PID_DIR=/var/run/hadoop-hdfs
    export HADOOP_LOG_DIR=/var/log/hadoop-hdfs
    export HADOOP_NAMENODE_USER=hdfs
    export HADOOP_SECONDARYNAMENODE_USER=hdfs
    export HADOOP_DATANODE_USER=hdfs
    export HADOOP_IDENT_STRING=hdfs
    
    # export HADOOP_SECURE_DN_USER=hdfs
    # export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    # export HADOOP_SECURE_DN_LOG_DIR=/var/log/hadoop-hdfs
    $ cat /etc/default/hadoop-hdfs-secondarynamenode
    ...
    export HADOOP_PID_DIR=/var/run/hadoop-hdfs
    export HADOOP_LOG_DIR=/var/log/hadoop-hdfs
    export HADOOP_NAMENODE_USER=hdfs
    export HADOOP_SECONDARYNAMENODE_USER=hdfs
    export HADOOP_DATANODE_USER=hdfs
    export HADOOP_IDENT_STRING=hdfs
    
    # export HADOOP_SECURE_DN_USER=hdfs
    # export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    # export HADOOP_SECURE_DN_LOG_DIR=/var/log/hadoop-hdfs
    $ cat /etc/default/hadoop-hdfs-datanode
    ...
    export HADOOP_PID_DIR=/var/run/hadoop-hdfs
    export HADOOP_LOG_DIR=/var/log/hadoop-hdfs
    export HADOOP_NAMENODE_USER=hdfs
    export HADOOP_SECONDARYNAMENODE_USER=hdfs
    export HADOOP_DATANODE_USER=hdfs
    export HADOOP_IDENT_STRING=hdfs
    
    # export HADOOP_SECURE_DN_USER=hdfs
    # export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    # export HADOOP_SECURE_DN_LOG_DIR=/var/log/hadoop-hdfs
  2. 設定ファイル(/etc/hadoop/conf/hdfs-site.xml)を編集します。 info.pngCDH4以降では、HDFSの高可用性機構として新たに QuorumJournalManager? が追加されましたが、デフォルトでは従来型の FileJournalManager? が使用されます。
    1. <configuration>
    2.     <property>
    3.         <name>dfs.namenode.name.dir</name>
    4.         <value>file:///grid/vol/0/var/lib/${user.name}/name</value>
    5.     </property>
    6.     <property>
    7.         <name>dfs.datanode.data.dir</name>
    8.         <value>file:///grid/vol/0/var/lib/${user.name}/data</value>
    9.     </property>
    10.     <property>
    11.         <name>dfs.namenode.checkpoint.dir</name>
    12.         <value>file:///grid/vol/0/var/lib/${user.name}/checkpoint</value>
    13.     </property>
    14.     <property>
    15.         <name>dfs.replication</name>
    16.         <value>1</value>
    17.     </property>
    18. </configuration>
  3. HDFSをフォーマットします。
    $ sudo -u hdfs hdfs namenode -format
  4. 各デーモンを起動します。
    $ sudo service hadoop-hdfs-namenode start
    $ sudo service hadoop-hdfs-secondarynamenode start
    $ sudo service hadoop-hdfs-datanode start
  5. HDFS上に必要なディレクトリを作成します。クォータ管理できないため、/tmp は作成しません。
    $ sudo -u hdfs hadoop fs -chown hdfs:hadoop /
    $ sudo -u hdfs hadoop fs -chmod 755         /
    $ sudo -u hdfs hadoop fs -mkdir /user
    $ sudo -u hdfs hadoop fs -chown hdfs:hadoop /user
    $ sudo -u hdfs hadoop fs -chmod 755         /user
  6. Web UIのアクセスURLは以下の通りです。
    http://localhost:50070/

YARN

  1. 環境変数を設定します(/etc/hadoop/conf/yarn-env.sh)。以下のような内容をファイルの先頭に追加します。$YARN_PID_DIR はデフォルト(/var/run/hadoop-yarn および /var/run/hadoop-mapreduce)のままで良いでしょう。
    1. # default: /var/run/hadoop-yarn, /var/run/hadoop-mapreduce
    2. #export YARN_PID_DIR=/grid/vol/0/var/run/${USER}
    3. # default: /var/log/hadoop-yarn, /var/log/hadoop-mapreduce
    4. export YARN_LOG_DIR=/grid/vol/0/var/log/${USER}
    5. ...
    1. info.pngなお、デフォルト環境設定は以下のとおりです。
      $ cat /etc/default/hadoop-yarn-resourcemanager
      ...
      export YARN_IDENT_STRING=yarn
      export YARN_PID_DIR=/var/run/hadoop-yarn
      export YARN_LOG_DIR=/var/log/hadoop-yarn
      export YARN_CONF_DIR=/etc/hadoop/conf
      $ cat /etc/default/hadoop-yarn-nodemanager
      ...
      export YARN_IDENT_STRING=yarn
      export YARN_PID_DIR=/var/run/hadoop-yarn
      export YARN_LOG_DIR=/var/log/hadoop-yarn
      export YARN_CONF_DIR=/etc/hadoop/conf
  2. 設定ファイルを用意します(/etc/hadoop/conf/yarn-site.xml)。単一サーバでの検証では、あまりにもリソースが少ないとジョブが実行できない場合がありますので、メモリリソースは多めに設定しておきます。info.pngCDHのデフォルトスケジューラは、CDH4の FifoScheduler? から(Apache Hadoop 2.2.0で正式リリースされたためか)CDH本命(?)の FairScheduler?*1 に変更になっていますが、Apache HadoopおよびHDPのデフォルトスケジューラは CapacityScheduler? ですので、ここではコミュニティ本命と思われる CapacityScheduler? を採用しています。またCDH5では、Apache Hadoop 2.2ベースとなりましたので、Apache Hadoop 2.0.3aからすでに導入されていたCPUコア数のリソース管理機能がはじめて提供されることになりました。
    1. <configuration>
    2.     <property>
    3.         <name>yarn.log-aggregation-enable</name>
    4.         <value>true</value>
    5.     </property>
    6.     <property>
    7.         <name>yarn.resourcemanager.scheduler.class</name>
    8.         <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    9.         <description>In case you do not want to use the default scheduler</description>
    10.     </property>
    11.     <property>
    12.         <name>yarn.nodemanager.local-dirs</name>
    13.         <value>/grid/vol/0/var/lib/${user.name}/nm/local</value>
    14.         <description>the local directories used by the nodemanager
    15.         (default: /tmp/nm-local-dir)</description>
    16.     </property>
    17.     <property>
    18.         <name>yarn.nodemanager.resource.memory-mb</name>
    19.         <value>8192</value>
    20.         <description>Amount of physical memory, in MB, that can be allocated
    21.         for containers. (default: 8192)</description>
    22.     </property>
    23.     <!--
    24.     <property>
    25.         <name>yarn.nodemanager.resource.cpu-cores</name>
    26.         <value>8</value>
    27.         <description>Number of CPU cores that can be allocated
    28.         for containers. (default: 8)</description>
    29.     </property>
    30.     -->
    31.     <property>
    32.         <name>yarn.nodemanager.remote-app-log-dir</name>
    33.         <value>/grid/vol/0/var/log/${user.name}/nm</value>
    34.         <description>directory on hdfs where the application logs are moved to
    35.         (default: /tmp/logs)</description>
    36.     </property>
    37.     <property>
    38.         <name>yarn.nodemanager.log-dirs</name>
    39.         <value>/grid/vol/0/var/log/${user.name}/nm</value>
    40.         <description>the directories used by Nodemanagers as log directories
    41.         (default: /tmp/logs)</description>
    42.     </property>
    43.     <property>
    44.         <name>yarn.nodemanager.aux-services</name>
    45.         <value>mapreduce_shuffle</value>
    46.         <description>shuffle service that needs to be set for Map Reduce to run</description>
    47.     </property>
    48.     <property>
    49.         <name>yarn.application.classpath</name>
    50.         <value>
    51.            $HADOOP_CONF_DIR,
    52.            $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
    53.            $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
    54.            $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
    55.            $HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*
    56.         </value>
    57.         <description>Classpath for typical applications.</description>
    58.     </property>
    59. <configuration>
    • note.pngApache Hadoop 2.2.0と同様に、yarn.nodemanager.aux-services の設定値の命名規則が変更になっています。mapreduce.shuffle ではなく、mapreduce_shuffle とします。
    • info.pngyarn.application.classpath プロパティ設定値の中の $YARN_HOME/*,$YARN_HOME/lib/*$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/* に変更されています。
  3. ローカルファイルシステム上に必要なディレクトリを作成します。
    $ sudo mkdir -p /grid/vol/0/var/log/yarn/nm/local    # yarn.nodemanager.{log-dirs,local-dirs}
    $ sudo chown yarn:hadoop -R /grid/vol/0/var/log/yarn
    $ sudo chmod 755 -R         /grid/vol/0/var/log/yarn
  4. HDFS上に必要なディレクトリを作成します。ログアグリゲーション有効時に、yarn.nodemanager.remote-app-log-dir にユーザ権限でログが移されます。
    $ sudo -u hdfs hadoop fs -mkdir -p /grid/vol/0/var/log/yarn/nm    # yarn.nodemanager.remote-app-log-dir
    $ sudo -u hdfs hadoop fs -chown yarn:hadoop /grid/vol/0/var/log/yarn/nm
    $ sudo -u hdfs hadoop fs -chmod 1777        /grid/vol/0/var/log/yarn/nm
  5. CapacityScheduler?の設定ファイル(/etc/hadoop/conf/capacity-scheduler.xml)を適宜編集します。
  6. 各デーモンを起動します。
    $ sudo service hadoop-yarn-resourcemanager start
    $ sudo service hadoop-yarn-nodemanager start
  7. Web UIのアクセスURLは以下の通りです。
    http://localhost:8088/    # ResourceManager
    http://localhost:8042/    # NodeManager

MapReduce?アプリケーション

  1. info.pngApache Hadoopでは、2.0.2 から /etc/hadoop/conf/mapred-env.sh で環境変数を設定するようになりましたが、CDH5ではじめて分離がなされました。デフォルト環境設定は以下のとおりですが、設定ファイルが分散してしまいますのでこのファイルは直接編集しない方がよいでしょう。info.pngプレフィックス YARN_ の付いた3つの環境変数が削除され、整合性が取れるようになりました。
    $ cat /etc/default/hadoop-mapreduce-historyserver 
    ...
    export HADOOP_MAPRED_IDENT_STRING=mapred
    export HADOOP_MAPRED_PID_DIR=/var/run/hadoop-mapreduce
    export HADOOP_MAPRED_LOG_DIR=/var/log/hadoop-mapreduce
    export HADOOP_LOG_DIR=/var/log/hadoop-mapreduce
    export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
  2. 設定ファイル(/etc/hadoop/conf/mapred-site.xml)を編集します。
    1. <configuration>
    2.     <property>
    3.         <name>mapreduce.framework.name</name>
    4.         <value>yarn</value>
    5.         <description>The runtime framework for executing MapReduce jobs.
    6.         Can be one of local, classic or yarn.
    7.         (default: local)
    8.         </description>
    9.     </property>
    10.     <property>
    11.         <name>yarn.app.mapreduce.am.staging-dir</name>
    12.         <value>/user</value>
    13.     </property>
    14.     <property>
    15.         <name>mapreduce.jobhistory.intermediate-done-dir</name>
    16.         <value>/grid/vol/0/var/lib/mapred/history/done_intermediate</value>
    17.         <!-- NG: <value>/user</value> -->
    18.     </property>
    19.     <property>
    20.         <name>mapreduce.jobhistory.done-dir</name>
    21.         <value>/grid/vol/0/var/lib/mapred/history/done</value>
    22.     </property>
    23. </configuration>
    1. info.pngYARNにおける staging ディレクトリの設定は、yarn.app.mapreduce.am.staging-dir で行います。MapReduce? Ver.1 を使用する場合には、従来通り mapreduce.jobtracker.staging.root.dir で設定します。なお、他の関連設定のデフォルト値は以下のようです。
      No.設定キーデフォルト値備考
      1yarn.app.mapreduce.am.staging-dir/tmp/hadoop-yarn/staging
      2mapreduce.jobhistory.intermediate-done-dir${yarn.app.mapreduce.am.staging-dir}/history/done_intermediatemapred-default.xml に見えず
      3mapreduce.jobhistory.done-dir${yarn.app.mapreduce.am.staging-dir}/history/donemapred-default.xml に見えず
  3. ローカルファイルシステム上に必要なディレクトリはありません。
  4. HDFS上に必要なディレクトリを作成します。
    $ sudo -u hdfs hadoop fs -mkdir -p /grid/vol/0/var/lib/mapred/history
    $ sudo -u hdfs hadoop fs -chown -R mapred:hadoop /grid/vol/0/var/lib/mapred
    $ sudo -u hdfs hadoop fs -chmod -R 755           /grid/vol/0/var/lib/mapred
  5. ResouceManager?NodeManager? を再起動して反映させます。
  6. 履歴サーバを起動します。
    $ sudo service hadoop-mapreduce-historyserver start
  7. 履歴サーバWeb UIのアクセスURLは以下の通りです。
    http://localhost:19888/

MapReduce? v1

※説明は割愛します。

テスト

  1. テストユーザを追加し、サンプルジョブを実行してみます。
    $ sudo adduser alice
    $ sudo -u hdfs hadoop fs -mkdir /user/alice
    $ sudo -u hdfs hadoop fs -chown alice:alice /user/alice
    $ sudo -u alice hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 5 10
     or
    $ sudo -u alice yarn jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 5 10
    ...
    1. すでに /etc/hadoop/conf/hadoop-env.sh にも設定しましたが、YARNの導入によりMapReduce?フレームワークはユーザスペースに移行していますので、PigやHiveを利用する場合には、ユーザが $HADOOP_MAPRED_HOME を適切に設定する必要があります。
      $ export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce

完全分散モード

  • 完全分散とは、動作モードというよりはむしろ疑似分散ではただ一つのノードで起動させていた各デーモンを、それぞれ適切な複数の別のノード(群)で運用する環境のことです。もちろん、これが本格的な実運用環境となります。
  • 構築方法は基本的に疑似分散の場合と変わりませんが、以下のような勘所があります。

Chefレシピ

info.png参考までに、これはここで説明している完全分散環境を構築するChefレシピ(ロール)の作成についての解説です。

  • cake.pnggrid-chef-repo:/roles/hadoop-pleiades.rb: まず、これはデフォルトでは、Apache版のHadoopクラスタを構築するロールです。
  • CDHでクラスタ構築する場合には新規のロールを定義し、以下の要領で run_list に yum-cdh およびこの hadoop-pleiades ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::cdh レシピは、RPMパッケージを用いてCDHのインストールを行います。CDHでは、alternativesシステムで設定ファイルセットを切り替えますので、node['hadoop']['cdh']['alternatives']['hadoop-conf'] も適切に設定します。
    1. name 'test-cdh'
    2. description 'Testing Cloudera\'s Distribution, including Apache Hadoop'
    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-pleiades]',
    12.   #'role[hadoop-pleiades-with-security]',
    13.   'role[java7]',
    14. )
    15.  
    16. # (...)
    17.  
    18. default_attributes(
    19.   'cdh' => {
    20.     'version' => '5.0.0',
    21.     'yum_repo' => {
    22.       'with_gplextras' => true
    23.     }
    24.   },
    25.   'hadoop' => {
    26.     'install_flavor' => 'cdh',
    27.     'cdh' => {
    28.       'alternatives' => {
    29.         'hadoop-conf' => {
    30.           'path' => '/etc/hadoop/conf.pleiades',
    31.           'priority' => '40'
    32.         }
    33.       },
    34.       'resource_negotiator_framework' => 'YARN',  # CDH4,5 only.
    35.     },
    36.     'HADOOP_CLASSPATH' => '',
    37.     'HADOOP_USER_CLASSPATH_FIRST' => 'false',
    38.     # for 2.0.x only
    39.     'container-executor' => {
    40.       'min.user.id' => '500'
    41.     },
    42.     #'yarn.nodemanager.linux-container-executor.resources-handler.class' \
    43.     #  => 'org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler',
    44.     },
    45.   }
    46. )

LDAP認可環境

  1. Hadoopでは協調動作する全ノードで統一的に権限認可(主にグループ解決)を管理する必要がありますので、Name Service Switch (NSS) のバックエンドデータベースとして一般的なLDAPを構築するとよいでしょう。
  2. CDH4以降には hadoop.security.group.mapping に設定する GroupMappingServiceProvider? として LdapGroupsMapping? が追加されていますが、最終的にユーザ権限でTaskプロセスを起動させる関係上、権限解決はOSレベルに統一して委譲するのが効果的です。そのような点で、JniBasedUnixGroupsMapping? を使用するのが運用、パフォーマンス両面で最も効果的です。
  3. 基本的なLDAP環境の構築方法については、LDAPセットアップforHadoopをご参照ください。
  4. Hadoop起動ユーザのためのldifファイル(例: hadoop_users-2.0.ldif)を作成し、それらのユーザを追加します。note.pngもしLDAPをすでにKerberos化している場合には、以下、認証に関するコマンドパラメータを適切に変更して実行してください。
    $ ldapadd -cxWD cn=admin,dc=grid,dc=example,dc=com -f hadoop_users-2.0.ldif
    Enter LDAP Password:
    adding new entry "cn=hadoop,ou=groups,dc=grid,dc=example,dc=com"
    
    adding new entry "uid=hadoop,ou=people,dc=grid,dc=example,dc=com"
    
    adding new entry "cn=hdfs,ou=groups,dc=grid,dc=example,dc=com"
    
    adding new entry "uid=hdfs,ou=people,dc=grid,dc=example,dc=com"
    
    adding new entry "cn=yarn,ou=groups,dc=grid,dc=example,dc=com"
    
    adding new entry "uid=yarn,ou=people,dc=grid,dc=example,dc=com"
    
    adding new entry "cn=mapred,ou=groups,dc=grid,dc=example,dc=com"
    
    adding new entry "uid=mapred,ou=people,dc=grid,dc=example,dc=com"
    
  5. テストユーザのためのldifファイル(例: test_users.ldif)を作成し、そのユーザを追加します。
    $ ldapadd -cxWD cn=admin,dc=grid,dc=example,dc=com -f test_users.ldif
    Enter LDAP Password:
    adding new entry "cn=alice,ou=groups,dc=grid,dc=example,dc=com"
    
    adding new entry "uid=alice,ou=people,dc=grid,dc=example,dc=com"

分散監視環境

  1. Ganglia
  2. Nagios

基本設定

  1. 当然ながら、ホスト名はすべて完全修飾名(FQDN)で設定します。
  2. 冗長化のためVIPを付与している各サービスHDFS(NameNodeSecondaryNameNode)、YARN(ResourceManager?JobHistoryServer?)、MapReduce? v1(JobTracker)についてはそのVIPに対するDNS名を設定します。

チェックポイントデータの冗長保存

  1. /etc/hadoop/conf/core-site.xml: dfs.namenode.checkpoint.dir に複数の格納先を指定することにより、チェックポイントデータを冗長に保存することが可能になります。
    1.     <property>
    2.         <name>dfs.namenode.checkpoint.dir</name>
    3.         <value>file:///grid/vol/0/var/lib/${user.name}/checkpoint,file:///export/home/${user.name}/var/lib/checkpoint</value>
    4.     </property>

HDFSメタデータの冗長保存

  1. /etc/hadoop/conf/hdfs-site.xml: dfs.namenode.name.dir に複数の格納先を指定することにより、メタデータを冗長に保存することが可能になります。この場合、指定したディレクトリはあらかじめ作成しておく必要があるようです。
    1.     <property>
    2.         <name>dfs.namenode.name.dir</name>
    3.         <value>file:///grid/vol/0/var/lib/${user.name}/name,file:///export/home/${user.name}/var/lib/name</value>
    4.     </property>

並列化の徹底

  1. 以下の例では、/grid/vol/{0,1} にそれぞれのディスクをマウントしています。
    $ sudo mkdir -p /grid/vol/{0,1}/var/lib
    $ sudo chown -R root:hadoop /grid/vol/{0,1}/var
    $ sudo chmod -R 775         /grid/vol/{0,1}/var
    $ sudo mkdir -p /grid/vol/{0,1}/tmp    # MapReduce v1のみ
    $ sudo chmod 1777 /grid/vol/{0,1}/tmp
  2. HDFS(/etc/hadoop/conf/hdfs-site.xml): 当然ながら、レプリカ数も推奨値の3にします。
    1.     <property>
    2.         <name>dfs.datanode.data.dir</name>
    3.         <value>file:///grid/vol/0/var/lib/${user.name}/data,file:///grid/vol/1/var/lib/${user.name}/data</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.replication</name>
    7.         <value>3</value>
    8.     </property>
  3. YARN(/etc/hadoop/conf/yarn-site.xml
    1.     <property>
    2.         <name>yarn.nodemanager.local-dirs</name>
    3.         <value>/grid/vol/0/var/lib/${user.name}/nm/local,/grid/vol/1/var/lib/${user.name}/nm/local</value>
    4.         <description>the local directories used by the nodemanager
    5.         (default: /tmp/nm-local-dir)</description>
    6.     </property>
    7.     <property>
    8.         <name>yarn.nodemanager.log-dirs</name>
    9.         <value>/grid/vol/0/var/log/${user.name}/nm,/grid/vol/1/var/log/${user.name}/nm</value>
    10.         <description>the directories used by Nodemanagers as log directories
    11.         (default: /tmp/logs)</description>
    12.     </property>
  4. MapReduce? v1(/etc/hadoop/conf/mapred-site.xml※説明は割愛します。

ノード管理の徹底

  1. HDFS(/etc/hadoop/conf/hdfs-site.xml
    1.     <property>
    2.         <name>dfs.hosts</name>
    3.         <value>/etc/hadoop/conf/hosts.include</value>
    4.         <description>
    5.           Names a file that contains a list of hosts that are permitted to connect to the namenode.
    6.           The full pathname of the file must be specified. If the value is empty, all hosts are permitted.
    7.         </description>
    8.     </property>
    9.     <property>
    10.         <name>dfs.hosts.exclude</name>
    11.         <value>/etc/hadoop/conf/hosts.exclude</value>
    12.         <description>
    13.           Names a file that contains a list of hosts that are not permitted to connect to the namenode.
    14.           The full pathname of the file must be specified. If the value is empty, no hosts are excluded.
    15.         </description>
    16.     </property>
  2. YARN(/etc/hadoop/conf/yarn-site.xml
    1.     <property>
    2.         <name>yarn.resourcemanager.nodes.include-path</name>
    3.         <value>/etc/hadoop/conf/hosts.include</value>
    4.         <description>Path to file with nodes to include.</description>
    5.     </property>
    6.     <property>
    7.         <name>yarn.resourcemanager.nodes.exclude-path</name>
    8.         <value>/etc/hadoop/conf/hosts.exclude</value>
    9.         <description>Path to file with nodes to exclude.</description>
    10.     </property>
  3. MapReduce? v1(/etc/hadoop/conf/mapred-site.xml※説明は割愛します。

セキュア設定の有効化

note.png既知の問題

  • それほど支障はありませんが、hadoopコマンドの実行時とJobHistoryServer?の起動時に、SLF4Jの実装ロガーへのバインドに失敗しています。
    $ hadoop fs -ls /
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    ...

参考リソース

  1. 設定ファイル一式
  2. CDH 5 Beta 1 Documentation

*1 興味深いところですが、Clouderaはドキュメント(Migrating to MapReduce 2 on YARN (For Operators))等で CapacityScheduler? のサポートをあまり明言せず、FairScheduler?の利用を推奨しているようです。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-05-15 (木) 21:22:21 (1376d)