Apache PigなどHadoopも含めて関連技術を勉強中なので、MapReduceモードでPigを動作させるためにHadoopをセットアップしてみました。
通常、オンプレにHadoop環境を構築する際は、Apache Hadoopではなく、ClouderaやHortonworksなどのディストリビューションを利用した方が良いですが、まずはApache Hadoopをインストールして実行を確認してみます。
今回は、Ubuntu 14.04上にHadoop 2.5.0をシングルノードクラスター(疑似分散モード)としてセットアップしてMapReduceのサンプルを実行するまでの手順を試した際のメモになります。
ほぼ、公式ドキュメントApache Hadoop 2.5.0 – Hadoop MapReduce Next Generation 2.5.0 – Setting up a Single Node Cluster.の手順に沿ったものです。
必要なソフトウェアのセットアップ
Javaをインストール
Javaは、OracleでもOpenJDKでも良いようなので、Ubuntu 14.04のデフォルトのJDKをインストールします。
HadoopJavaVersions – Hadoop Wiki
$ sudo apt-get update
$ sudo apt-get install -y default-jdk
$ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-4ubuntu1~0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
必要なパッケージをインストール
ドキュメントには、sshとrsyncをインストールすると書いてありますが、Ubuntu 14.04にはどちらも標準でインストール済みです。
Hadoopのインストール
この記事を書いている時点の最新は2.5.0です。
Apache Download Mirrorsよりhadoop-2.5.0.tar.gzをダウンロードします。
$ wget http://apache.petsads.us/hadoop/common/hadoop-2.5.0/hadoop-2.5.0.tar.gz
ダウンロードしたアーカイブをインストール先のディレクトリに解凍します。
$ tar xvfz hadoop-2.5.0.tar.gz
コマンドのディレクトリへパスを通します。
$ sudo vi /etc/profile
...
export PATH=/<展開したディレクトリ>/hadoop-2.5.0/bin:$PATH
$ source /etc/profile
JAVA_HOMEをhadoop-envに指定します。
# /etc/hadoop/hadoop-env.sh
# set to the root of your Java installation
export JAVA_HOME=/usr/lib/jvm/default-java
コマンドを実行して確認
$ hadoop
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
スタンドアローンモードでの実行確認
$ cd hadoop-2.5.0/
$ mkdir input
$ cp etc/hadoop/*.xml input
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar grep input output 'dfs[a-z.]+'
実行結果を確認
$ cat output/*
1 dfsadmin
疑似分散(Pseudo-Distributed)モード
疑似分散モードとは、HDFSデーモンのNameNodeとDataNode、YARNデーモンのResourceMangerおよびNodeManagerをすべて同じサーバー上(localhostまたは127.0.0.1)で起動するモードです。
設定ファイルを編集
設定ファイルはetc/hadoopディレクトリにあります。
core-site.xmlにproperty要素を追加します。
<!-- /etc/hadoop/core-site.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
...
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xmlにプロパティdfs.replicationを1にセットしたproperty要素を追加します。
<!-- etc/hadoop/hdfs-site.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
...
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
localhostにパスフレーズ無しでsshで入れるか確認
Hadoopは、ssh越しに各デーモンを起動します。これは疑似分散モードでも同じです。
またsshはパスフレーズ無しで入れるように設定する必要が有ります。
以下のようにsshコマンドでログインできることを確認します。
$ ssh localhost
入れない場合は以下のコマンドを実行します。
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ファイルシステムをフォーマット
初回は、デーモンを起動する前にフォーマットが必要です。
$ hdfs namenode -format
...
Re-format filesystem in Storage Directory /tmp/hadoop-root/dfs/name ? (Y or N)
Y (Enter)
...
HDFSデーモンを起動
HDFSデーモンの起動はsbin/start-dfs.shを実行します。
正しく起動したかjpsコマンドで確認。NameNode、DataNodeがあれば正しく起動されています。
$ hadoop-2.5.0/sbin/start-dfs.sh
$ jps
8668 NameNode
9130 Jps
8807 DataNode
9021 SecondaryNameNode
Webインタフェースの確認
$ sudo ufw allow 50070/tcp
http://
MapReduceを実行する
MapReduceに使うワークディレクトリをHDFS上に作成
$ hadoop fs -mkdir /user
$ hadoop fs -mkdir /user/<username>
入力データをHDFS上のディレクトリのアップロードして、exampleを実行
$ cd hadoop-2.5.0
$ hadoop fs -put etc/hadoop input
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar grep input output 'dfs[a-z.]+'
14/09/07 12:23:54 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/09/07 12:23:54 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
14/09/07 12:23:54 WARN mapreduce.JobSubmitter: No job jar file set. User classes may not be found. See Job or Job#setJar(String).
14/09/07 12:23:55 INFO input.FileInputFormat: Total input paths to process : 26
14/09/07 12:23:55 INFO mapreduce.JobSubmitter: number of splits:26
14/09/07 12:23:55 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local1945689622_0001
...
14/09/07 12:23:56 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
14/09/07 12:23:56 INFO mapreduce.Job: Running job: job_local1945689622_0001
...
HDFS上に結果が出力されていることを確認できます。
$ hadoop fs -cat output/*
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file
PIを求めるサンプルも動かしてみると
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar pi 10 10000
...
Job Finished in 3.902 seconds
Estimated value of Pi is 3.14120000000000000000
HDFSの停止
$ sbin/stop-dfs.sh
YARNデーモン上でMapReduceジョブを実行
上記は、HDFSは使っていますが、MapReduceジョブはローカル実行されています。
ジョブを分散実行するためには、YARNデーモンを起動し、MapReduceの実行がYARN上で実行されるように設定をする必要があります。
設定ファイルを追加・編集
mapred-site.xmlを作成
$ cd hadoop-2.5.0/etc/hadoop/
$ cp mapred-site.xml.template mapred-site.xml
$ vi mapred-site.xml
mapreduce.framework.nameをyarnにセット(デフォルトは”local”)
[xml title=”etc/hadoop/mapred-site.xml” highlight=”5,6,7,8″]
…
[/xml]
yarn-site.xmlで、yarn.nodemanager.aux-servicesをmapreduce_shuffleにセット
[xml title=”etc/hadoop/yarn-site.xml” highlight=”5,6,7,8″]
…
[/xml]
start-yarn.shを実行して、ResourceManagerおよびNodeManagerの起動を確認
$ sbin/start-yarn.sh
$ jps
9260 DataNode
11245 ResourceManager
9425 SecondaryNameNode
11690 Jps
11383 NodeManager
9095 NameNode
exampleを再び実行。今回はJobがYARN上で実行される。
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar grep input output 'dfs[a-z.]+'
14/09/07 12:14:58 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
14/09/07 12:14:59 WARN mapreduce.JobSubmitter: No job jar file set. User classes may not be found. See Job or Job#setJar(String).
14/09/07 12:14:59 INFO input.FileInputFormat: Total input paths to process : 26
14/09/07 12:14:59 INFO mapreduce.JobSubmitter: number of splits:26
14/09/07 12:15:00 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1410092087383_0001
14/09/07 12:15:00 INFO mapred.YARNRunner: Job jar is not present. Not adding any jar to the list of resources.
14/09/07 12:15:00 INFO impl.YarnClientImpl: Submitted application application_1410092087383_0001
14/09/07 12:15:00 INFO mapreduce.Job: The url to track the job: http://vagrant-ubuntu-trusty-64:8088/proxy/application_1410092087383_0001/
14/09/07 12:15:00 INFO mapreduce.Job: Running job: job_1410092087383_0001
...
結果を確認
$ hadoop fs -cat output/*
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file
参照
Steps To Setup Hadoop 2.4.0 (Single Node Cluster) on CentOS/RHEL