Hadoopセットアップ >

目次

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

Apache Hadoop

  1. Hadoop2.2 - 次世代Hadoop(YARN)GA
  2. Hadoop2.1 - DEPRECATED、次世代Hadoop(YARN)ベータ版
  3. Hadoop2.0 - DEPRECATED、次世代Hadoop(YARN)アルファ版
  4. Hadoop0.23 - DEPRECATED
  5. Hadoop1.2
  6. Hadoop1.1 - DEPRECATED
  7. Hadoop1.0 - DEPRECATED
  8. Hadoop0.20.2xx - DEPRECATED
  9. Hadoop0.20 - DEPRECATED

CDH (Cloudera's Distribution, including Apache Hadoop)

  1. CDH5 - Apache Hadoop 2.2ベース。YARN(次世代MapReduce?、ただし従来のMapReduce? v1も含む)
  2. CDH4 - Apache Hadoop 2.0ベース。YARN(次世代MapReduce?、ただし従来のMapReduce? v1を含み、その利用が推奨)
  3. CDH3 - DEPRECATED (End of Maintenance: June 20th, 2013.) Apache Hadoop 0.20ベースですが、Securityをはじめ様々な機能がバックポートされています。

HDP (Hortonworks Data Platform)

  1. HDP2.0 - Apache Hadoop 2.0ベース。YARN、次世代MapReduce?
  2. HDP1.3 - Apache Hadoop 1.2ベース。
  3. HDP1.2 - DEPRECATED Apache Hadoop 1.1ベース。

はじめのはじめに

  • データ解析プラットフォーム Pig は、Hadoopクラスタ環境がなくとも動作します。Pigを使って、簡単にHadoop利用が効果的かどうかを検証することができます。詳しくは、Hadoopのはじめ方をご参照ください。

はじめに

  • Hadoop のインストールおよびセットアップとは、基本となる分散ファイルシステムとそれを利用して稼働するMapReduce実行環境を構築することです。
  • 抽象的記述性の高い(つまりは人間にとって理解しやすい)大規模計算環境としては、MapReduce実行環境上で動作する PigHive の利用がおすすめです。

3つの配布パッケージ

  • Apache Hadoopでは主に三種類のパッケージ(package.pngtarアーカイブredhat.pngRPMdebian.pngDebian)を配布しています。
  • RPMあるいはDebianパッケージを使用するメリットは、起動ユーザが自動追加され、アプリケーションファイルが適切なロケーションに適切なパーミッションでインストールされる点です。また、システムへのサービス(デーモン)の追加も容易です。
    1. redhat.pngRPM
      $ sudo rpm -ihv hadoop-1.2.1-1.i386.rpm
      ...

3つの動作モード

  • Hadoopの動作モードには、スタンドアロン疑似分散完全分散という3つがあります。スタンドアロンが最も簡便ですが、動作を理解するためや開発には疑似分散を、もちろん商用には完全分散を使用するとよいでしょう。

ディレクトリ構成

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

1.2.x系最新版をセットアップします。 ローカルモードではなく、1機で分散処理環境を起動させます。以下のインスタンスを起動します。

  1. プライマリNameNode
  2. セカンダリNameNode
  3. DataNode
  4. JobTracker
  5. TaskTracker

Chefレシピ

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

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed.rb
    1. name 'hadoop-pseudo-distributed'
    2. description 'Hadoop pseudo distributed mode'
    3.  
    4. run_list(
    5.   'role[hadoop]'
    6. )
    7.  
    8. default_attributes(
    9.   'hadoop' => {
    10.     'version' => '1.2.1'
    11.   }
    12. )

ホスト名

  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. 起動ユーザを追加します。
    $ sudo adduser --shell /bin/sh --uid 10001 --disabled-password hadoop
    $ sudo adduser --shell /bin/sh --uid 10002 --disabled-password hdfs
    $ sudo usermod -G hadoop hdfs
    $ sudo adduser --shell /bin/sh --uid 10003 --disabled-password mapred
    $ sudo usermod -G hadoop mapred
  2. アーカイブを適当な場所に展開します。
    $ sudo tar xvzf hadoop-1.2.1.tar.gz -C /grid/usr
    $ cd /grid/usr
    $ sudo ln -s hadoop-1.2.1 hadoop
  3. ${HADOOP_HOME}/conf/hadoop-env.sh に環境にあわせて以下のような内容を追加します。
    1. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    2. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
    3. #export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
    4. export JAVA_HOME=/usr/local/jvm/java-6-ora
    5. #export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
    6. #export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
    7. #export JAVA_HOME=/usr/local/jvm/java-7-ora
    8. # The directory where pid files are stored. /tmp by default.
    9. export HADOOP_PID_DIR=/grid/vol/0/var/run/$USER
    10. # Where log files are stored. $HADOOP_HOME/logs by default.
    11. export HADOOP_LOG_DIR=/grid/vol/0/var/log/$USER
    1. debian.pngredhat.pngRPM、Debianパッケージの場合には、HADOOP_PID_DIRはデフォルト(/var/run/hadoop)のままで良いでしょう。
  4. 設定ファイル ${HADOOP_HOME}/conf/core-site.xml を編集します。Hadoopはデフォルト設定状態でも動作するように(これは正しいことです)、hadoop.tmp.dir のデフォルト値である /tmp/hadoop-${user.name} 以下のディレクトリに、一時作業ファイルはもちろんのこと、ある程度永続化が必要なデータ(主にHDFS関連)までも格納します。文字通りテンポラリという意味での hadoop.tmp.dir 設定は必要ですので、デフォルト設定はそのままとし、以下のセットアップでは永続化が必要なデータの格納場所を適切に設定変更していきます。
    1. ...
    2. <configuration>
    3.     <property>
    4.         <name>fs.default.name</name>
    5.         <value>hdfs://localhost:9000</value>
    6.     </property>
    7.     <property>
    8.         <name>hadoop.tmp.dir</name>
    9.         <value>/tmp/hadoop-${user.name}</value>
    10.     </property>
    11.     <property>
    12.         <name>fs.checkpoint.dir</name>
    13.         <value>/grid/vol/0/var/lib/${user.name}/checkpoint</value>
    14.     </property>
    15. </configuration>
    1. note.pngポート9000番は、環境によっては php5-fpm でデフォルトで利用されるようです。ご注意ください。
  5. データなどを格納するディレクトリを用意します。
    $ sudo mkdir -p /grid/vol/0/var/{lib,run}
    $ sudo mkdir -p /grid/vol/0/var/log/hdfs
    $ sudo chown -R root:hadoop /grid/vol/0/var
    $ sudo chmod -R 775         /grid/vol/0/var
    1. info.png参考までに複数のHDDを搭載している場合には以下の通りです。
      $ sudo mkdir -p /grid/vol/{0,1,...}/var/lib
      $ sudo mkdir -p /grid/vol/0/var/log/hdfs
      $ sudo mkdir -p /grid/vol/0/var/run
      $ sudo chown -R root:hadoop /grid/vol/{0,1,...}/var
      $ sudo chmod -R 775         /grid/vol/{0,1,...}/var

HDFS

  1. 設定ファイル(${HADOOP_HOME}/conf/hdfs-site.xml)を編集します。
    1. <configuration>
    2.     <property>
    3.         <name>dfs.name.dir</name>
    4.         <value>/grid/vol/0/var/lib/${user.name}/name</value>
    5.     </property>
    6.     <property>
    7.         <name>dfs.data.dir</name>
    8.         <value>/grid/vol/0/var/lib/${user.name}/data</value>
    9.     </property>
    10.     <property>
    11.         <name>dfs.replication</name>
    12.         <value>1</value>
    13.     </property>
    14. </configuration>
  2. HDFSをフォーマットします。
    $ cd ${HADOOP_HOME}
    $ sudo -u hdfs ./bin/hadoop namenode -format
  3. 各デーモンを起動します。
    $ sudo -u hdfs ./bin/hadoop-daemon.sh start namenode
    $ sudo -u hdfs ./bin/hadoop-daemon.sh start secondarynamenode
    $ sudo -u hdfs ./bin/hadoop-daemon.sh start datanode
  4. HDFS上に必要なディレクトリを作成します。クォータ管理できないため、/tmp は作成しません。
    $ sudo -u hdfs ./bin/hadoop fs -chown hdfs:hdfs /
    $ sudo -u hdfs ./bin/hadoop fs -chmod 755 /
    $ sudo -u hdfs ./bin/hadoop fs -mkdir /user
  5. Web UIのアクセスURLは以下の通りです。
    http://localhost:50070/

MapReduce?

  1. 設定ファイル(${HADOOP_HOME}/conf/mapred-site.xml)を編集します。
    1. <configuration>
    2.     <property>
    3.         <name>mapred.job.tracker</name>
    4.         <value>localhost:9001</value>
    5.     </property>
    6.     <property>
    7.         <name>mapred.system.dir</name>
    8.         <value>/grid/vol/0/var/lib/${user.name}/system</value>
    9.     </property>
    10.     <property>
    11.         <name>mapreduce.jobtracker.staging.root.dir</name>
    12.         <value>/user</value>
    13.     </property>
    14. </configuration>
  2. HDFS上に必要なディレクトリを作成します。
    $ cd ${HADOOP_HOME}
    $ sudo -u hdfs ./bin/hadoop fs -mkdir /grid/vol/0/var/lib/mapred
    $ sudo -u hdfs ./bin/hadoop fs -chown mapred:mapred /grid/vol/0/var/lib/mapred
  3. 各デーモンを起動します。
    $ sudo -u mapred ./bin/hadoop-daemon.sh start jobtracker
    $ sudo -u mapred ./bin/hadoop-daemon.sh start tasktracker
  4. Web UIのアクセスURLは以下の通りです。
    http://localhost:50030/

テスト

  1. テストユーザを追加し、サンプルジョブを実行してみます。
    $ sudo adduser alice
    $ sudo -u hdfs ./bin/hadoop fs -mkdir /user/alice
    $ sudo -u hdfs ./bin/hadoop fs -chown alice:alice /user/alice
    $ sudo -u alice ./bin/hadoop jar hadoop-examples-1.2.1.jar pi 5 10
    ...

完全分散モード

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

Chefレシピ

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

  • cake.pnggrid-chef-repo:/roles/hadoop-pleiades.rb
    1. name 'hadoop-pleiades'
    2. description 'Pleiades Hadoop cluster node'
    3.  
    4. run_list(
    5.   # LDAP (option)
    6.   #'role[nameservice-client-grid]',
    7.   'role[hadoop]'
    8. )
    9.  
    10. grid_vol_root = '/grid/vol'
    11. hadoop_attributes = {
    12.   'version' => '1.2.1',
    13.   # core-site.xml
    14.   'this.cluster.name' => 'pleiades',
    15.   'this.domain' => 'grid.example.com',
    16.   'this.namenode.fqdn' => '${this.cluster.name}-nn.${this.domain}',
    17.   'fs.checkpoint.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/checkpoint,/export/home/${user.name}/var/lib/checkpoint",
    18.   # hdfs-site.xml
    19.   'this.secondary.namenode.fqdn' => '${this.cluster.name}-cn.${this.domain}',
    20.   'dfs.name.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/name,/export/home/${user.name}/var/lib/name",
    21.   'dfs.replication' => '3',
    22.   # mapred-site.xml
    23.   'this.jobtracker.fqdn' => '${this.cluster.name}-jt.${this.domain}',
    24.   'this.jobhistory.fqdn' => '${this.cluster.name}-jt.${this.domain}',
    25.   #'this.jobhistory.fqdn' => '${this.cluster.name}-jh.${this.domain}',
    26. }
    27.  
    28. default_attributes(
    29.   'grid' => {
    30.     'vol_root' => grid_vol_root,
    31.     'max_vol_nums' => '4'
    32.   },
    33.   'hadoop' => hadoop_attributes
    34. )

LDAP認可環境

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

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

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

HDFSメタデータの冗長保存

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

ジョブ状態情報の永続化

  1. ${HADOOP_HOME}/conf/mapred-site.xml: 比較的最近実行されたジョブの実行結果状態をHDFS上に永続化します。保存時間を時単位で設定しますので、(JobTracker障害時等の)ジョブ実行状態の確認が用途のようです。ここに永続化された状態情報は、JobTrackerのWeb UIの表示とは連動せず、hadoop job -status <job_id> コマンドで参照できます*1
    1.     <property>
    2.         <name>mapred.job.tracker.persist.jobstatus.active</name>
    3.         <value>true</value>
    4.         <description>Indicates if persistency of job status information is
    5.           active or not. (default: false)
    6.         </description>
    7.     </property>
    8.     <property>
    9.         <name>mapred.job.tracker.persist.jobstatus.hours</name>
    10.         <value>3</value>
    11.         <description>The number of hours job status information is persisted in DFS.
    12.           The job status information will be available after it drops of the memory
    13.           queue and between jobtracker restarts. With a zero value the job status
    14.           information is not persisted at all in DFS. (default: 0)
    15.         </description>
    16.     </property>
    17.     <property>
    18.         <name>mapred.job.tracker.persist.jobstatus.dir</name>
    19.         <value>/grid/vol/0/var/lib/mapred/jobstatus</value>
    20.         <description>The directory where the job status information is persisted
    21.           in a file system to be available after it drops of the memory queue and
    22.           between jobtracker restarts. (default: /jobtracker/jobsInfo)
    23.         </description>
    24.     </property>

ジョブ実行履歴の永続化

  1. ${HADOOP_HOME}/conf/mapred-site.xml: ジョブの実行履歴の保存先をデフォルトのローカルファイルシステムからHDFSに切り替えます。なお、hadoop.job.history.location は履歴の中間ファイルが書き出されるディレクトリで、ローカルファイルシステムのみが設定可能です。
    1.     <property>
    2.         <name>hadoop.job.history.location</name>
    3.         <value>file:///grid/vol/0/var/lib/mapred/history</value>
    4.         <description>hdfs:// is UNusable.</description>
    5.     </property>
    6.     <property>
    7.         <name>mapred.job.tracker.history.completed.location</name>
    8.         <value>hdfs:///grid/vol/0/var/lib/mapred/history/done</value>
    9.     </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
    $ sudo chmod 1777 /grid/vol/{0,1}/tmp
  2. ${HADOOP_HOME}/conf/hdfs-site.xml: 当然ながら、レプリカ数も推奨値の3にします。
    1.     <property>
    2.         <name>dfs.data.dir</name>
    3.         <value>/grid/vol/0/var/lib/${user.name}/data,/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. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>mapred.local.dir</name>
    3.         <value>/grid/vol/0/var/lib/mapred/local,/grid/vol/1/var/lib/mapred/local</value>
    4.         <description>
    5.           The local directory where MapReduce stores intermediate data files.
    6.           May be a comma-separated list of directories on different devices in order to spread disk i/o.
    7.           Directories that do not exist are ignored.
    8.         </description>
    9.     </property>
    10.     <property>
    11.         <name>mapred.temp.dir</name>
    12.         <value>/grid/vol/0/tmp/${user.name}/mapred,/grid/vol/1/tmp/${user.name}/mapred</value>
    13.         <description>
    14.           A shared directory for temporary files.
    15.         </description>
    16.     </property>

ノード管理の徹底

  1. ${HADOOP_HOME}/conf/hdfs-site.xml
    1.     <property>
    2.         <name>dfs.hosts</name>
    3.         <value>/grid/usr/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>/grid/usr/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. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>mapred.hosts</name>
    3.         <value>/grid/usr/hadoop/conf/hosts.include</value>
    4.         <description>
    5.           Names a file that contains the list of nodes that may connect to the jobtracker.
    6.           If the value is empty, all hosts are permitted.
    7.         </description>
    8.     </property>
    9.     <property>
    10.         <name>mapred.hosts.exclude</name>
    11.         <value>/grid/usr/hadoop/conf/hosts.exclude</value>
    12.         <description>
    13.           Names a file that contains the list of hosts that should be excluded by the jobtracker.
    14.           If the value is empty, no hosts are excluded.
    15.         </description>
    16.     </property>

セキュア設定の有効化

HadoopTips

参考リソース

  1. Apache Hadoop 1.2
  2. 設定ファイル一式

*1 この情報は、ジョブ完了時に書き出されます。ジョブ実行時にJobTrackerを再起動した場合には、そのジョブの状態情報は失われます。

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