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
HadoopはSSHで相互通信をするので、パスワードなしで通信できるようにキー交換する。
注意は、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>
<?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
以下は、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
これで実行環境ができた。
一度落としてしまうと、キー交換のやり直しが発生する。