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