Amazon Elastic Compute Cloud(EC2)にHadoop実行環境を構築する。

EC2上にHadoopをインストールする手順は、たくさん記事にされているが、備忘のためログにしておく。
kj-kiのはてなダイアリー:疑似分散モードでHadoopインストール」を参考にさせていただいた。

スケールアウトのメリットを測定することが当面の目的ではないため(MapReduceが動けばよいため)、疑似分散モードで動かす。
Hadoopのバージョンは1.2、AMIはAmazon Linux AMI、typeはt1.micro、リージョンはN.Virginia(U.S.Standard)で行った。

クライアントはMac Book Pro(OSX Lion)。

EC2の利用方法については、他の記事を参考にしていただくとして、ここでは割愛する。

セキュリティーグループは以下のようにした。

(注記)実際には、もっときちんと設定しなくてはならないが、テンポラリーで利用するためのインスタンスなので、緩く設定している。

このセキュリテリーグループをつかって、インスタンスを立ち上げる。
SSHのポートを開けてあるので、ターミナルからキーペアを使ってログインする。

MacBook-Pro:~ tetsuya$ ssh -i ~/.ssh/[your_keypairname.pem] ec2-user@[your_uri od aws ec2]

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 1 security update(s) out of 3 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-138-31-219 ~]$

yum updateをしろ、と言っているので、その通りupdateし、時刻がUTCになっているので、以下のようにして修正する。

[ec2-user@ip-10-138-31-219 ~]$ date
2013年  6月 20日 木曜日 13:45:24 UTC
[ec2-user@ip-10-138-31-219 ~]$ sudo rm /etc/localtime
[ec2-user@ip-10-138-31-219 ~]$ sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[ec2-user@ip-10-138-31-219 ~]$ date
2013年  6月 20日 木曜日 22:45:43 JST


hadoopユーザーを追加する。パスワードは任意でよい。

[ec2-user@ip-10-138-31-219 etc]$ sudo useradd hadoop
[ec2-user@ip-10-138-31-219 etc]$ sudo passwd hadoop
ユーザー hadoop のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。


次にJava SDKをインストールする。
Oracleサイトからjdkのver7 update25をダウンロードし、EC2に送るが、Filezillaがなぜか使えないので、コマンドラインから送る。

MacBook-Pro:Downloads tetsuya$ sftp -i ~/.ssh/[your_keypairname].pem ec2-user@[your_uri of aws ec2]
Connected to [your_uri of aws ec2].
sftp> put jdk-7u25-linux-x64.rpm jdk-7u25-linux-x64.rpm
Uploading jdk-7u25-linux-x64.rpm to /home/ec2-user/jdk-7u25-linux-x64.rpm
jdk-7u25-linux-x64.rpm                        100%   81MB 468.6KB/s   02:58

EC2にec2-userでログインし、JDKをインストールする。

[ec2-user@ip-10-138-31-219 ~]$ ls
jdk-7u25-linux-x64.rpm
[ec2-user@ip-10-138-31-219 ~]$ sudo rpm -ivh jdk-7u25-linux-x64.rpm 
準備中...                ########################################### [100%]
   1:jdk                    ########################################### [100%]
Unpacking JAR files...
	rt.jar...
	jsse.jar...
	charsets.jar...
	tools.jar...
	localedata.jar...

hadoopユーザーの.bashrcを書き換える。

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

export JAVA_HOME=/usr/java/jdk1.7.0_25
export PATH=$JAVA_HOME/bin:$PATH

開発環境構築の際につかったHadoop1.2.0をEC2に送る。

MacBook-Pro:Downloads tetsuya$ sftp -i ~/.ssh/[your_key_pairname] ec2-user@[your uri of aws ec2]
Connected to [your uri of aws ec2].
sftp> put hadoop-1.2.0.tar.gz hadoop-1.2.0.tar.gz
Uploading hadoop-1.2.0.tar.gz to /home/ec2-user/hadoop-1.2.0.tar.gz
hadoop-1.2.0.tar.gz                           100%   60MB 330.7KB/s   03:06


ec2-userで解凍する。

tar zxfv hadoop-1.2.0.tar.gz

hadoopを/opt/hadoop/におき、hadoopを所有者にする。

[ec2-user@ip-10-138-31-219 ~]$ sudo mv hadoop-1.2.0 /opt
[ec2-user@ip-10-138-31-219 ~]$ cd /opt
[ec2-user@ip-10-138-31-219 opt]$ sudo chown -R hadoop:hadoop ./hadoop-1.2.0/


hadoopユーザーの.bashrcにhadoopの場所を記載する。

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

export PATH=/usr/java/jdk1.7.0_25/bin:$PATH
export JAVA_HOME=/usr/java/jdk1.7.0_25
export HADOOP_INSTALL=/opt/hadoop-1.2.0
export PATH=$HADOOP_INSTALL/bin:$PATH


HadoopSSHで相互通信をするので、パスワードなしで通信できるようにキー交換する。
注意は、hadoopユーザーで実行することと、パスフェーズに何もいれないこと。

[hadoop@ip-10-138-31-219 ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_dsa): 
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hadoop/.ssh/id_dsa.
Your public key has been saved in /home/hadoop/.ssh/id_dsa.pub.
The key fingerprint is:
[finger print] hadoop@ip-10-138-31-219
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
| image       |
|                 |
|                 |
|                 |
+-----------------+
[hadoop@ip-10-138-31-219 ~]$ cd .ssh/
[hadoop@ip-10-138-31-219 .ssh]$ ls
id_dsa  id_dsa.pub
[hadoop@ip-10-138-31-219 .ssh]$ cat id_dsa.pub >> authorized_keys
[hadoop@ip-10-138-31-219 .ssh]$ chmod 600 authorized_keys 


必須ではないが、NameNodeをブラウズする際に、/etc/hostsを変更しておくとエラーが発生しない。

sudo vi /etc/hosts

[IP Address] localhost localhost.localdomain
127.0.0.1 [your uri of aws ec2]


Hadoopのコンフィグファイル3つを以下のように定義する。

Hadoopのコンフィグの設定>
/opt/hadoop-1.2.0/conf/core-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:8020</value>
  </property>
</configuration>

hdfs-sites.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:8020</value>
  </property>
</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:8020</value>
  </property>
</configuration>


hdfsをフォーマットする。

[hadoop@domU-12-31-39-06-6C-57 /]$ hadoop namenode -format

フォーマットすると、/tmpにhadoop-hadoopディレクトリができる。

疑似分散モードでhadoopデーモンを起動する。5つのデーモンが上がる。

[hadoop@domU-12-31-39-06-6C-57 ~]$ start-all.sh
starting namenode, logging to /opt/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-namenode-domU-12-31-39-06-6C-57.out
localhost: 
starting datanode, logging to /opt/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-datanode-domU-12-31-39-06-6C-57.out
localhost: 
starting secondarynamenode, logging to /opt/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-secondarynamenode-domU-12-31-39-06-6C-57.out
starting jobtracker, logging to /opt/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-jobtracker-domU-12-31-39-06-6C-57.out
localhost: 
starting tasktracker, logging to /opt/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-tasktracker-domU-12-31-39-06-6C-57.out

NameNodeをWebから確認する。

以下は、Browse File Systemを開いたところ。

examplesに入っているモンテカルロ法でパイを計算するサンプルを動かしてみる。

hadoop jar $HADOOP_INSTALL/hadoop-examples-1.2.0.jar pi 10 1000000
Job Finished in 4.091 seconds
Estimated value of Pi is 3.14158440000000000000

なぜか、50030で見れるはずのJobTrackerが見えない。。。

hadoopを落とすときは、以下のようにする。

[hadoop@domU-12-31-39-06-6C-57 bin]$ ./stop-all.sh 
no jobtracker to stop
localhost: no tasktracker to stop
stopping namenode
localhost: stopping datanode
localhost: stopping secondarynamenode

これで実行環境ができた。

一度落としてしまうと、キー交換のやり直しが発生する。