Apache PigなどHadoopも含めて関連技術を勉強中なので、MapReduceモードでPigを動作させるためにHadoopをセットアップしてみました。

通常、オンプレにHadoop環境を構築する際は、Apache Hadoopではなく、ClouderaHortonworksなどのディストリビューションを利用した方が良いですが、まずは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に指定します。

# 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要素を追加します。

<?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要素を追加します。

<?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://:50070 にアクセスすると以下の画面が表示される
Hadoop-web-interface

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 version="1.0"?>
...

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

yarn-site.xmlで、yarn.nodemanager.aux-servicesをmapreduce_shuffleにセット

<?xml version="1.0"?>
...
<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

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