Hadoopセットアップ > HDP >
DEPRECATED!: このバージョンのHadoopはすでに古いものです。ご利用は非推奨です。 HDP1.3セットアップ をご参照ください。
これは、HDP1.2 (Hortonworks Data Platform) の最新版 のセットアップ手順です。検証した内容を記述しておりますが、詳細かつ正確な情報については、Hortonworks のホームページをご参照ください。
目次 †
他のバージョンのセットアップ †
HDP (Hortonworks Data Platform) †
HDP2.0 - Apache Hadoop 2.0ベース。YARN、次世代MapReduce?
HDP1.2 - Apache Hadoop 1.1ベース。
Apache Hadoop †
Hadoop2.0 - YARN、次世代MapReduce?
Hadoop0.23 - DEPRECATED
Hadoop1.0
Hadoop0.20.2xx - DEPRECATED
Hadoop0.20
はじめのはじめに †
データ解析プラットフォーム Pig は、Hadoopクラスタ環境がなくとも動作します。Pigを使って、簡単にHadoop利用が効果的かどうかを検証することができます。詳しくは、Hadoopのはじめ方 をご参照ください。
はじめに †
配布パッケージ †
HDP1.2は(RPM で配布されています。Red Hat系のシステムでHDPのリポジトリを追加登録し、それらのパッケージをインストールすることができます。
以下では、 CentOS 6を例にセットアップの詳細を説明しています。
3つの動作モード †
Hadoopの動作モードには、スタンドアロン 、疑似分散 、完全分散 という3つがあります。スタンドアロンが最も簡便ですが、動作を理解するためや開発には疑似分散を、もちろん商用には完全分散を使用するとよいでしょう。
ディレクトリ構成 †
疑似分散モード(シングルノード) †
HDP1.2最新版をセットアップします。
ローカルモードではなく、1機で分散処理環境を起動させます。以下のインスタンスを起動します。
プライマリNameNode
セカンダリNameNode
DataNode
JobTracker
TaskTracker
HDPの設定ディレクトリは、/etc/hadoop/conf/ です。
Chefレシピ †
参考までに、これはここで説明している疑似分散環境を構築するChef レシピ(ロール)です。
grid-chef-repo:/roles /hadoop-pseudo-distributed.rb : これはデフォルトでは、Apache版のHadoopクラスタを構築するロールです。
grid-chef-repo:/roles /test-hdp-on-localhost.rb : HDPでクラスタ構築する場合には、このロールのように run_list に yum-hdp および hadoop-pseudo-distributed ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::hdp レシピは、RPMパッケージを用いてHDPのインストールを行います。
name 'test-hdp-on-localhost'
description 'Testing Hortonworks Data Platform on local machine'
run_list(
'role[node_commons]' ,
'role[chef_utils]' ,
#'role[nameservice-client]',
'role[ganglia-gmond-ucast-localhost]' ,
'role[ganglia-gmetad-localhost]' ,
'role[ganglia-web]' ,
'role[nagios]' ,
'role[yum-hdp]' ,
'role[hadoop-pseudo-distributed]' ,
#'role[hadoop-pseudo-distributed-with-security]',
)
# (...)
default_attributes(
'hdp' => {
#'version' => '2.0.0.2',
'version' => '1.2.3.1' ,
} ,
'hadoop' => {
'install_flavor' => 'hdp' ,
'HADOOP_CLASSPATH' => '' ,
'HADOOP_USER_CLASSPATH_FIRST' => 'false' ,
# for 1.x only
'taskcontroller' => {
'min.user.id' => '500'
} ,
}
)
ホスト名 †
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などをセットアップする必要はありません。
共通 †
アップグレード †
HDP1.2.3.1のリポジトリを追加します。
$ sudo wget http://public-repo-1.hortonworks.com/HDP/centos6/1.x/GA/hdp.repo -O /etc/yum.repos.d/hdp.repo
$ yum repolist
...
repo id repo name status
HDP-1.x Hortonworks Data Platform Version - HDP-1.x 52
HDP-UTILS-1.1.0.15 Hortonworks Data Platform Utils Version - HDP-UTILS-1.1.0.15 52
Updates-HDP-1.x HDP-1.x - Updates 53
Updates-ambari-1.x ambari-1.x - Updates 20
ambari-1.x Ambari 1.x 5
base CentOS-6 - Base 6,381
extras CentOS-6 - Extras 12
updates CentOS-6 - Updates 483
repolist: 7,058
以下のコマンドでアップグレードします。
$ sudo yum upgrade hadoop\*
新規インストール †
Oracle JDKはインストールされている前提です。
HDP1.2.3.1のリポジトリを追加します。
$ sudo wget -nv http://public-repo-1.hortonworks.com/HDP/centos6/1.x/updates/1.2.1/hdp.repo -O /etc/yum.repos.d/hdp.repo
$ sudo wget -nv http://public-repo-1.hortonworks.com/ambari/centos6/1.x/updates/1.2.2.4/ambari.repo
ノード毎に必要なデーモンパッケージ(疑似分散の場合には全て)をインストールします。
$ sudo yum install hadoop-{namenode,datanode,secondarynamenode,jobtracker,tasktracker}
hdfs、mapredユーザおよびhadoopグループが自動で追加されます。
$ id hdfs
uid=497(hdfs) gid=498(hdfs) groups=498(hdfs),499(hadoop)
$ id mapred
uid=498(mapred) gid=497(mapred) groups=497(mapred),499(hadoop)
インストール時に各デーモンの自動起動が有効になっていますので、もし運用上、支障があれば無効にします。
$ chkconfig | grep hadoop
hadoop-datanode 0:off 1:off 2:on 3:on 4:on 5:on 6:off
hadoop-jobtracker 0:off 1:off 2:on 3:on 4:on 5:on 6:off
hadoop-namenode 0:off 1:off 2:on 3:on 4:on 5:on 6:off
hadoop-secondarynamenode 0:off 1:off 2:on 3:on 4:on 5:on 6:off
hadoop-tasktracker 0:off 1:off 2:on 3:on 4:on 5:on 6:off
パフォーマンスが改善しますので、ネイティブライブラリもインストールしておきます。i386 版は提供されていませんので、ご注意ください。
$ sudo yum install hadoop-{libhdfs,native,pipes}
...
$ rpm -ql hadoop-libhdfs
/usr/include/hdfs.h
/usr/lib64/libhdfs.la
/usr/lib64/libhdfs.so
/usr/lib64/libhdfs.so.0
/usr/lib64/libhdfs.so.0.0.0
/usr/share/doc/libhdfs-1.1.2.21
/usr/share/doc/libhdfs-1.1.2.21/examples
/usr/share/doc/libhdfs-1.1.2.21/examples/hdfs_read.c
/usr/share/doc/libhdfs-1.1.2.21/examples/hdfs_test.c
/usr/share/doc/libhdfs-1.1.2.21/examples/hdfs_write.c
$ rpm -ql hadoop-native
/usr/lib/hadoop/lib/native
/usr/lib/hadoop/lib/native/Linux-amd64-64
/usr/lib/hadoop/lib/native/Linux-amd64-64/libhadoop.a
/usr/lib/hadoop/lib/native/Linux-amd64-64/libhadoop.la
/usr/lib/hadoop/lib/native/Linux-amd64-64/libhadoop.so
/usr/lib/hadoop/lib/native/Linux-amd64-64/libhadoop.so.1
/usr/lib/hadoop/lib/native/Linux-amd64-64/libhadoop.so.1.0.0
$ rpm -ql hadoop-pipes
/usr/include/hadoop/Pipes.hh
/usr/include/hadoop/SerialUtils.hh
/usr/include/hadoop/StringUtils.hh
/usr/include/hadoop/TemplateFactory.hh
/usr/lib64/libhadooppipes.a
/usr/lib64/libhadooputils.a
alternatives システムを利用して設定セットを管理します。以下の例では、conf.localhost 設定セットを作成し、有効にしています。
$ sudo cp -R /etc/hadoop/conf.empty /etc/hadoop/conf.localhost
$ sudo alternatives --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.
/etc/hadoop/conf/hadoop-env.sh に環境にあわせて以下のような内容を追加します。$HADOOP_PID_DIR はデフォルト(/var/run/hadoop)のままで良いでしょう。
export JAVA_HOME =/ usr/ java/ default
# The directory where pid files are stored. /var/run/hadoop by default.
#export HADOOP_PID_DIR=/grid/vol/0/var/run
# Where log files are stored. /var/log/hadoop by default.
export HADOOP_LOG_DIR =/ grid/ vol/ 0/ var/ log/ ${USER}
なお、デフォルトの設定は以下の通りです。
$ cat /etc/default/hadoop
...
export HADOOP_HOME_WARN_SUPPRESS=true
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_NAMENODE_USER=hdfs
export HADOOP_SECONDARYNAMENODE_USER=hdfs
export HADOOP_DATANODE_USER=hdfs
export HADOOP_JOBTRACKER_USER=mapred
export HADOOP_TASKTRACKER_USER=mapred
export HADOOP_IDENT_STRING=hadoop
export HADOOP_PID_DIR=/var/run/hadoop
export HADOOP_LOG_DIR=/var/log/hadoop
設定ファイル /etc/hadoop/conf/core-site.xml を編集します。文字通りテンポラリ という意味での 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,log,run}
$ 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/run
$ sudo chown -R root:hadoop /grid/vol/{0,1,...}/var
$ sudo chmod -R 775 /grid/vol/{0,1,...}/var
HDFS †
設定ファイル(/etc/hadoop/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をフォーマットします。
$ sudo -u hdfs hadoop namenode -format
各デーモンを起動します。
$ sudo service hadoop-namenode start
$ sudo service hadoop-secondarynamenode start
$ sudo service hadoop-datanamenode start
HDFS上に必要なディレクトリを作成します。クォータ管理できないため、/tmp は作成しません。 なお、HDP1.2のHDFSではまだsticky bit を設定できないため、/tmp ディレクトリを作成した場合、通常のフルアクセスディレクトリとなってしまいます。
$ sudo -u hdfs hadoop fs -chown hdfs:hdfs /
$ sudo -u hdfs hadoop fs -chmod 755 /
$ sudo -u hdfs hadoop fs -mkdir /user
Web UIのアクセスURLは以下の通りです。
http://localhost:50070/
MapReduce? †
設定ファイル(/etc/hadoop/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上に必要なディレクトリを作成します。
$ sudo -u hdfs hadoop fs -mkdir /grid/vol/0/var/lib/mapred
$ sudo -u hdfs hadoop fs -chown mapred:mapred /grid/vol/0/var/lib/mapred
各デーモンを起動します。
$ sudo service hadoop-jobtracker start
$ sudo service hadoop-tasktracker start
Web UIのアクセスURLは以下の通りです。
http://localhost:50030/
テスト †
テストユーザを追加し、サンプルジョブを実行してみます。
$ 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/hadoop-examples.jar pi 5 10
完全分散モード †
完全分散とは、動作モードというよりはむしろ疑似分散ではただ一つのノードで起動させていた各デーモンを、それぞれ適切な複数の別のノード(群)で運用する環境のことです。もちろん、これが本格的な実運用環境となります。
構築方法は基本的に疑似分散の場合と変わりませんが、以下のような勘所があります。
Chefレシピ †
参考までに、これはここで説明している完全分散環境を構築するChef レシピ(ロール)の作成についての解説です。
grid-chef-repo:/roles /hadoop-pleiades.rb : まず、これはデフォルトでは、Apache版のHadoopクラスタを構築するロールです。
HDPでクラスタ構築する場合には新規のロールを定義し、以下の要領で run_list に yum-hdp およびこの hadoop-pleiades ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::hdp レシピは、RPMパッケージを用いてHDPのインストールを行います。HDPでは、alternativesシステムで設定ファイルセットを切り替えますので、node['hadoop']['hdp']['alternatives']['hadoop-conf'] も適切に設定します。
name 'test-hdp'
description 'Testing Hortonworks Data Platform.'
run_list(
'role[node_commons]' ,
'role[chef_utils]' ,
#'role[nameservice-client]',
'role[ganglia-gmond-ucast-localhost]' ,
'role[ganglia-gmetad-localhost]' ,
'role[ganglia-web]' ,
'role[nagios]' ,
'role[yum-hdp]' ,
'role[hadoop-pleiades]' ,
#'role[hadoop-pleiades-with-security]',
)
# (...)
default_attributes(
'hdp' => {
#'version' => '2.0.0.2',
'version' => '1.2.3.1' ,
} ,
'hadoop' => {
'install_flavor' => 'hdp' ,
'hdp' => {
'alternatives' => {
'hadoop-conf' => {
'path' => '/etc/hadoop/conf.pleiades' ,
'priority' => '40'
}
}
} ,
'HADOOP_CLASSPATH' => '' ,
'HADOOP_USER_CLASSPATH_FIRST' => 'false' ,
# for 1.x only
'taskcontroller' => {
'min.user.id' => '500'
} ,
}
)
LDAP認可環境 †
Hadoopでは協調動作する全ノードで統一的に権限認可(主にグループ解決)を管理する必要がありますので、Name Service Switch (NSS) のバックエンドデータベースとして一般的なLDAPを構築するとよいでしょう。
基本的な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名を設定します。
チェックポイントデータの冗長保存 †
/etc/hadoop/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メタデータの冗長保存 †
/etc/hadoop/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>
ジョブ状態情報の永続化 †
/etc/hadoop/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>
ジョブ実行履歴の永続化 †
/etc/hadoop/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
/etc/hadoop/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>
/etc/hadoop/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>
ノード管理の徹底 †
/etc/hadoop/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>
/etc/hadoop/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>
セキュア設定の有効化 †
参考リソース †
http://docs.hortonworks.com/