Amazon Elastic MapReduceを使う(その4:マスタノードにSSHで接続して、普通にhadoopをつかってみる)

2014/6/8 記事を更新しました。


今回の記事では、AmazonEMRのマスターノードにSSHで接続してみる。
結論をいってしまうと、EMRのEC2インスタンスにログインして、普通にhadoopを使う事ができる。

セキュリィーグループの変更

EMRを一度使うと、EC2のセキュリティーグループに、以下の2つのセキュリティグループが追加される。前者はマスターインスタンスグループに適用され、後者がコアインスタンスグループ、タスクインスタンスグループに適用される。

  • ElasticMapReduce-master
  • ElasticMapReduce-slave

マスタインスタンスにログインするには、ElasticMapReduce-masterを変更して、Inboundに22を追加する。

22番をAdd Rule後に、その下にあるApply Rule Changeを押して変更を反映する。
セキュリテリーグループを変更は動的には反映されないので、ジョブフローを再起動して新しいルールを適用させる。
EMRではJobTrackerのWebインターフェイスが9101、NameNodeのWebインターフェイスが9100を使うので、ついでにInboundに追加しておく。

SSHでログインする先のマスタのホスト名は、EC2の管理画面から、EMRのインスタンスを選択し、Description中に記載されているセキュリティグループ名から判別する。


SSHでログインするときのユーザーはhadoopを使う。

ssh -i ~/.ssh/[your key pair name].pem hadoop@[your uri of ec2 instance working as master]


ps auxすると、ネームノード、ジョブトラッカーとして起動していることが分かる。

envを見ると、sunのjava6がインストールされていることが分かる。

hadoop@ip-10-122-126-242:~$ env

TERM=xterm-256color
SHELL=/bin/bash
HADOOP_HOME=/home/hadoop
SSH_CLIENT=[your address] 63394 22
SSH_TTY=/dev/pts/0
USER=hadoop
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:
MAIL=/var/mail/hadoop
PATH=/usr/local/cuda/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/hadoop/bin
PWD=/home/hadoop
JAVA_HOME=/usr/lib/jvm/java-6-sun
LANG=ja_JP.UTF-8
SHLVL=1
HOME=/home/hadoop
LOGNAME=hadoop
HADOOP_HOME_WARN_SUPPRESS=true
SSH_CONNECTION=[your address] 63394 10.122.126.242 22
_=/usr/bin/env

また、コマンドラインツール(elastic mapreduce ruby)からもSSHでログインできる。

MacBook-Pro:~ tetsuya$ elastic-mapreduce --jobflow j-30XXXXXXXXXX --ssh

ssh -o ServerAliveInterval=10 -o StrictHostKeyChecking=no -i [your ssh keyfile] hadoop@[your uri of euc2].compute-1.amazonaws.com 
Linux (none) 3.2.30-49.59.amzn1.i686 #1 SMP Wed Oct 3 19:55:00 UTC 2012 i686
--------------------------------------------------------------------------------

Welcome to Amazon Elastic MapReduce running Hadoop and Debian/Squeeze.
 
Hadoop is installed in /home/hadoop. Log files are in /mnt/var/log/hadoop. Check
/mnt/var/log/hadoop/steps for diagnosing step failures.

The Hadoop UI can be accessed via the following commands: 

  JobTracker    lynx http://localhost:9100/
  NameNode      lynx http://localhost:9101/
 
--------------------------------------------------------------------------------
Last login: Fri Jun 14 05:48:32 2013 from 202.215.132.79
hadoop@ip-10-122-126-242:~$ 

サンプルを実行する。

hadoopでマスタにログインすると、ホームディレクトリにHadoop一式が入っている。hadoopのバージョンは1.0.3、webappsはjettyによるNameNodeとJobTrackerの管理アプリが配備されている。

hadoop@domU-12-31-39-0A-58-75:~$ ls 
PATCHES.txt		 hadoop-core-1.0.3.jar	       hadoop-tools.jar
bin			 hadoop-core.jar	       lib
conf			 hadoop-examples-1.0.3.jar     lib64
contrib			 hadoop-examples.jar	       libexec
etc			 hadoop-minicluster-1.0.3.jar  native
hadoop-ant-1.0.3.jar	 hadoop-test-1.0.3.jar	       sbin
hadoop-ant.jar		 hadoop-test.jar	       templates
hadoop-client-1.0.3.jar  hadoop-tools-1.0.3.jar        webapps


hadoop-examples-1.0.3.jarがあるので、モンテカルロ法によるパイの計算を行ってみる。EC2で構築したときよりも重たい感じがする。

hadoop@domU-12-31-39-0A-58-75:~$ hadoop jar hadoop-examples-1.0.3.jar pi 10 1000000
Number of Maps  = 10
Samples per Map = 1000000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
13/06/22 00:32:53 INFO mapred.JobClient: Default number of map tasks: 10
13/06/22 00:32:53 INFO mapred.JobClient: Default number of reduce tasks: 1
13/06/22 00:32:53 INFO security.ShellBasedUnixGroupsMapping: add hadoop to shell userGroupsCache
13/06/22 00:32:53 INFO mapred.JobClient: Setting group to hadoop
13/06/22 00:32:53 INFO mapred.FileInputFormat: Total input paths to process : 10
13/06/22 00:32:54 INFO mapred.JobClient: Running job: job_201306212248_0001
13/06/22 00:32:55 INFO mapred.JobClient:  map 0% reduce 0%
13/06/22 00:33:13 INFO mapred.JobClient:  map 10% reduce 0%
13/06/22 00:33:16 INFO mapred.JobClient:  map 20% reduce 0%
13/06/22 00:33:19 INFO mapred.JobClient:  map 30% reduce 0%
13/06/22 00:33:22 INFO mapred.JobClient:  map 40% reduce 0%
13/06/22 00:33:25 INFO mapred.JobClient:  map 50% reduce 0%
13/06/22 00:33:26 INFO mapred.JobClient:  map 70% reduce 0%
13/06/22 00:33:28 INFO mapred.JobClient:  map 80% reduce 0%
13/06/22 00:33:31 INFO mapred.JobClient:  map 90% reduce 0%
13/06/22 00:33:32 INFO mapred.JobClient:  map 100% reduce 0%
13/06/22 00:33:34 INFO mapred.JobClient:  map 100% reduce 26%
13/06/22 00:33:40 INFO mapred.JobClient:  map 100% reduce 100%
13/06/22 00:33:45 INFO mapred.JobClient: Job complete: job_201306212248_0001
13/06/22 00:33:45 INFO mapred.JobClient: Counters: 30
13/06/22 00:33:45 INFO mapred.JobClient:   Job Counters 
13/06/22 00:33:45 INFO mapred.JobClient:     Launched reduce tasks=1
13/06/22 00:33:45 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=68737
13/06/22 00:33:45 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/06/22 00:33:45 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/06/22 00:33:45 INFO mapred.JobClient:     Rack-local map tasks=10
13/06/22 00:33:45 INFO mapred.JobClient:     Launched map tasks=10
13/06/22 00:33:45 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=26804
13/06/22 00:33:45 INFO mapred.JobClient:   File Input Format Counters 
13/06/22 00:33:45 INFO mapred.JobClient:     Bytes Read=1180
13/06/22 00:33:45 INFO mapred.JobClient:   File Output Format Counters 
13/06/22 00:33:45 INFO mapred.JobClient:     Bytes Written=97
13/06/22 00:33:45 INFO mapred.JobClient:   FileSystemCounters
13/06/22 00:33:45 INFO mapred.JobClient:     FILE_BYTES_READ=124
13/06/22 00:33:45 INFO mapred.JobClient:     HDFS_BYTES_READ=2450
13/06/22 00:33:45 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=275364
13/06/22 00:33:45 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=215
13/06/22 00:33:45 INFO mapred.JobClient:   Map-Reduce Framework
13/06/22 00:33:45 INFO mapred.JobClient:     Map output materialized bytes=370
13/06/22 00:33:45 INFO mapred.JobClient:     Map input records=10
13/06/22 00:33:45 INFO mapred.JobClient:     Reduce shuffle bytes=370
13/06/22 00:33:45 INFO mapred.JobClient:     Spilled Records=40
13/06/22 00:33:45 INFO mapred.JobClient:     Map output bytes=180
13/06/22 00:33:45 INFO mapred.JobClient:     Total committed heap usage (bytes)=1814405120
13/06/22 00:33:45 INFO mapred.JobClient:     CPU time spent (ms)=9510
13/06/22 00:33:45 INFO mapred.JobClient:     Map input bytes=240
13/06/22 00:33:45 INFO mapred.JobClient:     SPLIT_RAW_BYTES=1270
13/06/22 00:33:45 INFO mapred.JobClient:     Combine input records=0
13/06/22 00:33:45 INFO mapred.JobClient:     Reduce input records=20
13/06/22 00:33:45 INFO mapred.JobClient:     Reduce input groups=20
13/06/22 00:33:45 INFO mapred.JobClient:     Combine output records=0
13/06/22 00:33:45 INFO mapred.JobClient:     Physical memory (bytes) snapshot=1622740992
13/06/22 00:33:45 INFO mapred.JobClient:     Reduce output records=0
13/06/22 00:33:45 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=5260263424
13/06/22 00:33:45 INFO mapred.JobClient:     Map output records=20
Job Finished in 52.322 seconds
Estimated value of Pi is 3.14158440000000000000

以下がJobTrackerのWebインターフェイス。EC2上で、hadoop1.2を使って実行環境を構築した際にはなぜか見る事ができなかった。

カスタムプログラムを実行する。

これまでの記事では、S3をファイルシステムとしてHadoopの入出力ファイルを作成し、プログラムもS3に配備していた。
ここでは、通常の方法(EC2インスタンスに入出力ファイルとプログラムを配備して実行する)を試してみる。以前のログで作成した、Tweetのワードカウントの入力ファイル(tweets_noun.txt)と、プログラム(hadoopsample.jarのMainクラス)を動かしてみる


sftpでhadoopマスタにログインし、入力データとプログラムを送る。

MacBook-Pro:~ tetsuya$ sftp -i [your keypair name].pem hadoop@[your uri of ec2 instance working as master ]
Connected to ec2-184-73-24-15.compute-1.amazonaws.com.
sftp> put tweets_noun.txt tweets_noun.txt
Uploading tweets_noun.txt to /home/hadoop/tweets_noun.txt
tweets_noun.txt                               100%   93KB  93.2KB/s   00:01    
sftp> put hadoopsample.jar hadoopsample.jar
Uploading hadoopsample.jar to /home/hadoop/hadoopsample.jar
hadoopsample.jar                              100% 3665     3.6KB/s   00:01  

hadoopでマスタにログインし、入力ファイルをHDFSにのせる。

hadoop@domU-12-31-39-0A-58-75:~$ hadoop fs -copyFromLocal tweets_noun.txt .
hadoop@domU-12-31-39-0A-58-75:~$ hadoop fs -ls .
Found 1 items
-rw-r--r--   1 hadoop supergroup      95391 2013-06-22 00:42 /user/hadoop/tweets_noun.txt


プログラムを実行する。

hadoop@domU-12-31-39-0A-58-75:~$ hadoop jar hadoopsample.jar Main tweets_noun.txt ./output
13/06/22 00:44:20 INFO mapred.JobClient: Default number of map tasks: null
13/06/22 00:44:20 INFO mapred.JobClient: Setting default number of map tasks based on cluster size to : 8
13/06/22 00:44:20 INFO mapred.JobClient: Default number of reduce tasks: 3
13/06/22 00:44:20 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/06/22 00:44:20 INFO security.ShellBasedUnixGroupsMapping: add hadoop to shell userGroupsCache
13/06/22 00:44:20 INFO mapred.JobClient: Setting group to hadoop
13/06/22 00:44:20 INFO input.FileInputFormat: Total input paths to process : 1
13/06/22 00:44:20 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
13/06/22 00:44:20 WARN lzo.LzoCodec: Could not find build properties file with revision hash
13/06/22 00:44:20 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev UNKNOWN]
13/06/22 00:44:20 WARN snappy.LoadSnappy: Snappy native library is available
13/06/22 00:44:20 INFO snappy.LoadSnappy: Snappy native library loaded
13/06/22 00:44:21 INFO mapred.JobClient: Running job: job_201306212248_0002
13/06/22 00:44:22 INFO mapred.JobClient:  map 0% reduce 0%
13/06/22 00:44:41 INFO mapred.JobClient:  map 100% reduce 0%
13/06/22 00:44:56 INFO mapred.JobClient:  map 100% reduce 33%
13/06/22 00:44:57 INFO mapred.JobClient:  map 100% reduce 66%
13/06/22 00:45:05 INFO mapred.JobClient:  map 100% reduce 100%
13/06/22 00:45:10 INFO mapred.JobClient: Job complete: job_201306212248_0002
13/06/22 00:45:10 INFO mapred.JobClient: Counters: 29
13/06/22 00:45:10 INFO mapred.JobClient:   Job Counters 
13/06/22 00:45:10 INFO mapred.JobClient:     Launched reduce tasks=3
13/06/22 00:45:10 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=17849
13/06/22 00:45:10 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/06/22 00:45:10 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/06/22 00:45:10 INFO mapred.JobClient:     Rack-local map tasks=1
13/06/22 00:45:10 INFO mapred.JobClient:     Launched map tasks=1
13/06/22 00:45:10 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=34764
13/06/22 00:45:10 INFO mapred.JobClient:   File Output Format Counters 
13/06/22 00:45:10 INFO mapred.JobClient:     Bytes Written=19987
13/06/22 00:45:10 INFO mapred.JobClient:   FileSystemCounters
13/06/22 00:45:10 INFO mapred.JobClient:     FILE_BYTES_READ=18706
13/06/22 00:45:10 INFO mapred.JobClient:     HDFS_BYTES_READ=95509
13/06/22 00:45:10 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=137295
13/06/22 00:45:10 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=19987
13/06/22 00:45:10 INFO mapred.JobClient:   File Input Format Counters 
13/06/22 00:45:10 INFO mapred.JobClient:     Bytes Read=95391
13/06/22 00:45:10 INFO mapred.JobClient:   Map-Reduce Framework
13/06/22 00:45:10 INFO mapred.JobClient:     Map output materialized bytes=18694
13/06/22 00:45:10 INFO mapred.JobClient:     Map input records=14069
13/06/22 00:45:10 INFO mapred.JobClient:     Reduce shuffle bytes=18694
13/06/22 00:45:10 INFO mapred.JobClient:     Spilled Records=4032
13/06/22 00:45:10 INFO mapred.JobClient:     Map output bytes=151382
13/06/22 00:45:10 INFO mapred.JobClient:     CPU time spent (ms)=3480
13/06/22 00:45:10 INFO mapred.JobClient:     Total committed heap usage (bytes)=209522688
13/06/22 00:45:10 INFO mapred.JobClient:     Combine input records=14012
13/06/22 00:45:10 INFO mapred.JobClient:     SPLIT_RAW_BYTES=118
13/06/22 00:45:10 INFO mapred.JobClient:     Reduce input records=2016
13/06/22 00:45:10 INFO mapred.JobClient:     Reduce input groups=2016
13/06/22 00:45:10 INFO mapred.JobClient:     Combine output records=2016
13/06/22 00:45:10 INFO mapred.JobClient:     Physical memory (bytes) snapshot=330461184
13/06/22 00:45:10 INFO mapred.JobClient:     Reduce output records=2016
13/06/22 00:45:10 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1961996288
13/06/22 00:45:10 INFO mapred.JobClient:     Map output records=14012
true


結果を確認する。

hadoop@domU-12-31-39-0A-58-75:~$ hadoop fs -ls ./output
Found 4 items
-rw-r--r--   1 hadoop supergroup          0 2013-06-22 00:45 /user/hadoop/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup       6340 2013-06-22 00:44 /user/hadoop/output/part-r-00000
-rw-r--r--   1 hadoop supergroup       6744 2013-06-22 00:44 /user/hadoop/output/part-r-00001
-rw-r--r--   1 hadoop supergroup       6903 2013-06-22 00:44 /user/hadoop/output/part-r-00002
hadoop@domU-12-31-39-0A-58-75:~$ hadoop fs -cat ./output/part-r-00000 | more
&	1
(*^^*)	20
(*_*)	1
(^	29
(^-^)	7
(^^;	1
(^○^)	1
( ̄□ ̄;)	1
)	44
)?	5
) 	7
)〜』	1
,	89

無事、普通に入出力ファイル、プログラムの配備と実行ができることがわかった。