Hadoop >
これは、Apache Hadoopの最新安定版 のセットアップ手順です。
Hadoopセットアップ >
目次 †
他のバージョンのセットアップ †
Apache Hadoop †
Hadoop2.2 - 次世代Hadoop(YARN)GA
Hadoop2.1 - DEPRECATED 、次世代Hadoop(YARN)ベータ版
Hadoop2.0 - DEPRECATED 、次世代Hadoop(YARN)アルファ版
Hadoop0.23 - DEPRECATED
Hadoop1.2
Hadoop1.1 - DEPRECATED
Hadoop1.0 - DEPRECATED
Hadoop0.20.2xx - DEPRECATED
Hadoop0.20 - DEPRECATED
CDH (Cloudera's Distribution, including Apache Hadoop) †
CDH5 - Apache Hadoop 2.2ベース。YARN(次世代MapReduce? 、ただし従来のMapReduce? v1も含む)
CDH4 - Apache Hadoop 2.0ベース。YARN(次世代MapReduce? 、ただし従来のMapReduce? v1を含み、その利用が推奨)
CDH3 - DEPRECATED (End of Maintenance: June 20th, 2013.) Apache Hadoop 0.20ベースですが、Securityをはじめ様々な機能がバックポートされています。
HDP (Hortonworks Data Platform) †
HDP2.0 - Apache Hadoop 2.0ベース。YARN、次世代MapReduce?
HDP1.3 - Apache Hadoop 1.2ベース。
HDP1.2 - DEPRECATED Apache Hadoop 1.1ベース。
はじめのはじめに †
データ解析プラットフォーム Pig は、Hadoopクラスタ環境がなくとも動作します。Pigを使って、簡単にHadoop利用が効果的かどうかを検証することができます。詳しくは、Hadoopのはじめ方 をご参照ください。
はじめに †
3つの配布パッケージ †
Apache Hadoopでは主に三種類のパッケージ(tarアーカイブ 、RPM 、Debian )を配布しています。
RPMあるいはDebianパッケージを使用するメリットは、起動ユーザが自動追加され、アプリケーションファイルが適切なロケーションに適切なパーミッションでインストールされる点です。また、システムへのサービス(デーモン)の追加も容易です。
RPM
$ sudo rpm -ihv hadoop-1.2.1-1.i386.rpm
...
3つの動作モード †
Hadoopの動作モードには、スタンドアロン 、疑似分散 、完全分散 という3つがあります。スタンドアロンが最も簡便ですが、動作を理解するためや開発には疑似分散を、もちろん商用には完全分散を使用するとよいでしょう。
ディレクトリ構成 †
疑似分散モード(シングルノード) †
1.2.x系最新版をセットアップします。
ローカルモードではなく、1機で分散処理環境を起動させます。以下のインスタンスを起動します。
プライマリNameNode
セカンダリNameNode
DataNode
JobTracker
TaskTracker
Chefレシピ †
参考までに、これはここで説明している疑似分散環境を構築するChef レシピ(ロール)になります。
ホスト名 †
Hadoopの各デーモンは起動時に自ホストの名前を参照しますので、疑似分散環境(localhost)で検証する場合には、(必須ではありませんが)一時的に hostname に localhost を設定しておくと無難です。
$ sudo hostname localhost
hosts ファイルも適切に設定してあることを確認します。
$ cat /etc/hosts
127.0.0.1 localhost
192.168.0.10 this.host.example.com
...
LDAP認可環境 †
シングルノードではOSの静的ファイルによる権限解決で十分ですので、特にLDAPなどをセットアップする必要はありません。
共通 †
起動ユーザを追加します。
$ 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
アーカイブを適当な場所に展開します。
$ sudo tar xvzf hadoop-1.2.1.tar.gz -C /grid/usr
$ cd /grid/usr
$ sudo ln -s hadoop-1.2.1 hadoop
${HADOOP_HOME}/conf/hadoop-env.sh に環境にあわせて以下のような内容を追加します。
#export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
#export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
#export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
export JAVA_HOME =/ usr/ local / jvm/ java-6 -ora
#export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
#export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
#export JAVA_HOME=/usr/local/jvm/java-7-ora
# The directory where pid files are stored. /tmp by default.
export HADOOP_PID_DIR =/ grid/ vol/ 0/ var/ run/ $USER
# Where log files are stored. $HADOOP_HOME/logs by default.
export HADOOP_LOG_DIR =/ grid/ vol/ 0/ var/ log/ $USER
RPM、Debianパッケージの場合には、HADOOP_PID_DIRはデフォルト(/var/run/hadoop)のままで良いでしょう。
設定ファイル ${HADOOP_HOME}/conf/core-site.xml を編集します。Hadoopはデフォルト設定状態でも動作するように(これは正しいことです)、hadoop.tmp.dir のデフォルト値である /tmp /hadoop-${user.name} 以下のディレクトリに、一時作業ファイルはもちろんのこと、ある程度永続化が必要なデータ(主にHDFS関連)までも格納します。文字通りテンポラリ という意味での hadoop.tmp.dir 設定は必要ですので、デフォルト設定はそのままとし、以下のセットアップでは永続化が必要なデータの格納場所を適切に設定変更していきます。
...
<configuration>
<property>
<name> fs.default.name</name>
<value> hdfs://localhost:9000</value>
</property>
<property>
<name> hadoop.tmp.dir</name>
<value> /tmp/hadoop-${user.name}</value>
</property>
<property>
<name> fs.checkpoint.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/checkpoint</value>
</property>
</configuration>
ポート9000 番は、環境によっては php5-fpm でデフォルトで利用されるようです。ご注意ください。
データなどを格納するディレクトリを用意します。
$ 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
参考までに複数の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 †
設定ファイル(${HADOOP_HOME}/conf/hdfs-site.xml )を編集します。
<configuration>
<property>
<name> dfs.name.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/name</value>
</property>
<property>
<name> dfs.data.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/data</value>
</property>
<property>
<name> dfs.replication</name>
<value> 1</value>
</property>
</configuration>
HDFSをフォーマットします。
$ cd ${HADOOP_HOME}
$ sudo -u hdfs ./bin/hadoop namenode -format
各デーモンを起動します。
$ 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
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
Web UIのアクセスURLは以下の通りです。
http://localhost:50070/
MapReduce? †
設定ファイル(${HADOOP_HOME}/conf/mapred-site.xml )を編集します。
<configuration>
<property>
<name> mapred.job.tracker</name>
<value> localhost:9001</value>
</property>
<property>
<name> mapred.system.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/system</value>
</property>
<property>
<name> mapreduce.jobtracker.staging.root.dir</name>
<value> /user</value>
</property>
</configuration>
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
各デーモンを起動します。
$ sudo -u mapred ./bin/hadoop-daemon.sh start jobtracker
$ sudo -u mapred ./bin/hadoop-daemon.sh start tasktracker
Web UIのアクセスURLは以下の通りです。
http://localhost:50030/
テスト †
テストユーザを追加し、サンプルジョブを実行してみます。
$ 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 レシピ(ロール)です。
grid-chef-repo:/roles /hadoop-pleiades.rb
name 'hadoop-pleiades'
description 'Pleiades Hadoop cluster node'
run_list(
# LDAP (option)
#'role[nameservice-client-grid]',
'role[hadoop]'
)
grid_vol_root = '/grid/vol'
hadoop_attributes = {
'version' => '1.2.1' ,
# core-site.xml
'this.cluster.name' => 'pleiades' ,
'this.domain' => 'grid.example.com' ,
'this.namenode.fqdn' => '${this.cluster.name}-nn.${this.domain}' ,
'fs.checkpoint.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/checkpoint,/export/home/${user.name}/var/lib/checkpoint" ,
# hdfs-site.xml
'this.secondary.namenode.fqdn' => '${this.cluster.name}-cn.${this.domain}' ,
'dfs.name.dir' => "#{grid_vol_root}/0/var/lib/${user.name}/name,/export/home/${user.name}/var/lib/name" ,
'dfs.replication' => '3' ,
# mapred-site.xml
'this.jobtracker.fqdn' => '${this.cluster.name}-jt.${this.domain}' ,
'this.jobhistory.fqdn' => '${this.cluster.name}-jt.${this.domain}' ,
#'this.jobhistory.fqdn' => '${this.cluster.name}-jh.${this.domain}',
}
default_attributes(
'grid' => {
'vol_root' => grid_vol_root,
'max_vol_nums' => '4'
} ,
'hadoop' => hadoop_attributes
)
LDAP認可環境 †
Hadoopでは協調動作する全ノードで統一的に権限認可(主にグループ解決)を管理する必要がありますので、Name Service Switch (NSS) のバックエンドデータベースとして一般的なLDAPを構築するとよいでしょう。
Hadoop 2.0以降には hadoop.security.group.mapping に設定する GroupMappingServiceProvider? として LdapGroupsMapping? が追加されていますが、最終的にユーザ権限でTaskプロセスを起動させる関係上、権限解決はOSレベルに統一して委譲するのが効果的です。そのような点で、JniBasedUnixGroupsMapping? を使用するのが運用、パフォーマンス両面で最も効果的です。
基本的なLDAP環境の構築方法については、LDAPセットアップforHadoop をご参照ください。
Hadoop起動ユーザのためのldifファイル(例: hadoop_users.ldif )を作成し、それらのユーザを追加します。 もし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"
テストユーザのための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"
分散監視環境 †
Ganglia
Nagios
基本設定 †
当然ながら、ホスト名はすべて完全修飾名(FQDN)で設定します。
冗長化のためVIPを付与しているサービス(NameNode 、SecondaryNameNode 、JobTracker など)についてはそのVIPに対するDNS名を設定します。
チェックポイントデータの冗長保存 †
${HADOOP_HOME}/conf/core-site.xml : fs.checkpoint.dir に複数の格納先を指定することにより、チェックポイントデータを冗長に保存することが可能になります。
<property>
<name> fs.checkpoint.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/checkpoint,/export/home/${user.name}/var/lib/checkpoint</value>
</property>
HDFSメタデータの冗長保存 †
${HADOOP_HOME}/conf/hdfs-site.xml : dfs.name.dir に複数の格納先を指定することにより、メタデータを冗長に保存することが可能になります。この場合、指定したディレクトリはあらかじめ作成しておく必要があるようです。
<property>
<name> dfs.name.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/name,/export/home/${user.name}/var/lib/name</value>
</property>
ジョブ状態情報の永続化 †
${HADOOP_HOME}/conf/mapred-site.xml : 比較的最近実行されたジョブの実行結果状態をHDFS上に永続化します。保存時間を時単位で設定しますので、(JobTracker 障害時等の)ジョブ実行状態の確認が用途のようです。ここに永続化された状態情報は、JobTracker のWeb UIの表示とは連動せず、hadoop job -status <job_id> コマンドで参照できます*1 。
<property>
<name> mapred.job.tracker.persist.jobstatus.active</name>
<value> true</value>
<description> Indicates if persistency of job status information is
active or not. (default: false)
</description>
</property>
<property>
<name> mapred.job.tracker.persist.jobstatus.hours</name>
<value> 3</value>
<description> The number of hours job status information is persisted in DFS.
The job status information will be available after it drops of the memory
queue and between jobtracker restarts. With a zero value the job status
information is not persisted at all in DFS. (default: 0)
</description>
</property>
<property>
<name> mapred.job.tracker.persist.jobstatus.dir</name>
<value> /grid/vol/0/var/lib/mapred/jobstatus</value>
<description> The directory where the job status information is persisted
in a file system to be available after it drops of the memory queue and
between jobtracker restarts. (default: /jobtracker/jobsInfo)
</description>
</property>
ジョブ実行履歴の永続化 †
${HADOOP_HOME}/conf/mapred-site.xml : ジョブの実行履歴の保存先をデフォルトのローカルファイルシステムからHDFSに切り替えます。なお、hadoop.job.history.location は履歴の中間ファイルが書き出されるディレクトリで、ローカルファイルシステムのみが設定可能です。
<property>
<name> hadoop.job.history.location</name>
<value> file:///grid/vol/0/var/lib/mapred/history</value>
<description> hdfs:// is UNusable.</description>
</property>
<property>
<name> mapred.job.tracker.history.completed.location</name>
<value> hdfs:///grid/vol/0/var/lib/mapred/history/done</value>
</property>
並列化の徹底 †
以下の例では、/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
${HADOOP_HOME}/conf/hdfs-site.xml : 当然ながら、レプリカ数も推奨値の3 にします。
<property>
<name> dfs.data.dir</name>
<value> /grid/vol/0/var/lib/${user.name}/data,/grid/vol/1/var/lib/${user.name}/data</value>
</property>
<property>
<name> dfs.replication</name>
<value> 3</value>
</property>
${HADOOP_HOME}/conf/mapred-site.xml
<property>
<name> mapred.local.dir</name>
<value> /grid/vol/0/var/lib/mapred/local,/grid/vol/1/var/lib/mapred/local</value>
<description>
The local directory where MapReduce stores intermediate data files.
May be a comma-separated list of directories on different devices in order to spread disk i/o.
Directories that do not exist are ignored.
</description>
</property>
<property>
<name> mapred.temp.dir</name>
<value> /grid/vol/0/tmp/${user.name}/mapred,/grid/vol/1/tmp/${user.name}/mapred</value>
<description>
A shared directory for temporary files.
</description>
</property>
ノード管理の徹底 †
${HADOOP_HOME}/conf/hdfs-site.xml
<property>
<name> dfs.hosts</name>
<value> /grid/usr/hadoop/conf/hosts.include</value>
<description>
Names a file that contains a list of hosts that are permitted to connect to the namenode.
The full pathname of the file must be specified. If the value is empty, all hosts are permitted.
</description>
</property>
<property>
<name> dfs.hosts.exclude</name>
<value> /grid/usr/hadoop/conf/hosts.exclude</value>
<description>
Names a file that contains a list of hosts that are not permitted to connect to the namenode.
The full pathname of the file must be specified. If the value is empty, no hosts are excluded.
</description>
</property>
${HADOOP_HOME}/conf/mapred-site.xml
<property>
<name> mapred.hosts</name>
<value> /grid/usr/hadoop/conf/hosts.include</value>
<description>
Names a file that contains the list of nodes that may connect to the jobtracker.
If the value is empty, all hosts are permitted.
</description>
</property>
<property>
<name> mapred.hosts.exclude</name>
<value> /grid/usr/hadoop/conf/hosts.exclude</value>
<description>
Names a file that contains the list of hosts that should be excluded by the jobtracker.
If the value is empty, no hosts are excluded.
</description>
</property>
セキュア設定の有効化 †
参考リソース †
Apache Hadoop 1.2
設定ファイル一式