中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

EMR入門用 コマンドラインでの作業ログ

2014-05-27 15:03:01 | AWS

背景

EMRの手順がWebで調べてもよくわからない。おそらくWebのインターフェイスを使っていることが、メモをしにくくしているのだと思われる。 このページでは、コマンドラインインターフェイス(CLI)でのサンプル実行と確認までのメモを載せる。

手順

AWS CLI

s3のデータを確認するため、まずは、こちらをインストールする。EMRとしては必須ではない。 こちらはこのページでは紹介しないので、検索してインストールしていただきたい。 タブキーで補完するのが好きな方は、次の設定は~/.bash**に書いておくと便利。
complete -C aws_completer aws

EMR CLI

次に、EMRのCLI。AWSのCLIとは何の互換性もないようである。

install

rubyが必要なので、先にインストールしておく。 あとはこの通りなのだが、 もうちょっと説明すると、http://aws.amazon.com/developertools/2264 にてzipファイルを取得し、それを展開する。 多くのWebページの紹介(例えば、http://madoverload.wordpress.com/tag/amazon-elastic-mapreduce/など)ではこの展開したディレクトリでコマンド実行することになっているが、それだとローカルマシンに作業毎にディレクトリを作成して実行するスタイル?に合わない。 そこでファイル~/.credentials.jsonを作成し必要項目を入力する。 また、~/.bash**に次のようにalias をしておくと良い。
% alias elastic-mapreduce=~/lib/elastic-mapreduce-ruby/elastic-mapreduce
ここで~/lib/elastic-mapreduce-ruby/は先のzipファイルを展開したディレクトリである。このコマンドのみを~/binにシンボリックリンクを作っても、相対パスで書かれた別のファイルを読みに行くために、エラーが出力される。

立ち上げ

とりあえず立ち上げ

% elastic-mapreduce --create --alive --name hoge --num-instances 10
Created job flow j-AAAAAAAAAA
ここで--aliveオプションがないと、立ち上がった後すぐ完了(COMPLETED)してしまう。 また名前は、ユーザ名やインスタンス数などを入れておいたほうがいいかもしれない。

立ち上げたマシンを確認

% elastic-mapreduce --list
j-AAAAAAAAAA     STARTING                                                         hoge

インスタンスタイプを確認

% elastic-mapreduce -j j-AAAAAAAAAA --describe | grep InstanceType
            "InstanceType": "m1.small",
            "InstanceType": "m1.small",
        "MasterInstanceType": "m1.small",
        "SlaveInstanceType": "m1.small",

マスタを確認

% elastic-mapreduce -j j-AAAAAAAAA--describe | grep MasterPublicDnsName
        "MasterPublicDnsName": "ec2-XXXXXXXXXXXX.compute.amazonaws.com",
ログインも可能。
% ssh -i ~/.ssh/ds-emr.pem hadoop@ec2-XXXXXXXXXXXX.compute.amazonaws.com
hadoop@ip-XXXXXXXXXXX:~$

サンプルを実行

次のhttp://madoverload.wordpress.com/tag/amazon-elastic-mapreduce/https://aws.amazon.com/articles/2294にあるスクリプトをサンプルとして実行したい。
elastic-mapreduce --stream \
--input s3://elasticmapreduce/samples/similarity/lastfm/input \
--output hdfs:///user-counts \
--mapper s3://elasticmapreduce/samples/similarity/user_count_mapper.py \
--reducer aggregate \
-j j-AAAAAAA
ちょっと違うのは、outputをhdfsにしたことである。理由はサンプルで余計なs3を使いたくなかっただけである。

サンプルの確認

サンプルの確認は、次のとおりである。

マスタへログイン

% ssh -i ~/.ssh/ds-emr.pem hadoop@ec2-XXXXXXXXXXXX.compute.amazonaws.com
hadoop@ip-XXXXXXXXXXX:~$

hdfsの確認

http://www.mwsoft.jp/programming/hadoop/hdfs_shell.htmlを参考に、
% hadoop fs -ls /user-counts
Found 16 items
-rw-r--r--   2 hadoop supergroup          0 2014-05-27 08:24 /user-counts/_SUCCESS
-rw-r--r--   2 hadoop supergroup     110760 2014-05-27 08:24 /user-counts/part-00000
-rw-r--r--   2 hadoop supergroup     111639 2014-05-27 08:24 /user-counts/part-00001
…
-rw-r--r--   2 hadoop supergroup     109852 2014-05-27 08:24 /user-counts/part-00014
早くても数秒(5秒)かかる。中身を見る場合は一旦ローカルファイルシステムに落とす必要がある。
% hadoop fs -get /user-counts/part-00000 part-00000
% less part-00000
これも5秒以上かかる。

EMRの終了

終了コマンド

確認が終わったらお金もかかることなので、さっさと終了するべきである。次のコマンドで終了する。
% elastic-mapreduce -j j-AAAAAAAAA --terminate

終了できない時

次のようなエラーが出る。
Error: {"__type":"ValidationException","message":"Could not shut down one or more job flows since they are termination protected"}
この場合、次のコマンドでプロテクトを外すことができる。
% elastic-mapreduce -j j-AAAAAAAAA --set-termination-protection false
Enabled job flow termination j-AAAAAAAAA

ログを確認

次のawsコマンドで確認できる。
% aws s3 ls s3://XXXXXX/j-AAAAAAAAAAA/
                           PRE daemons/
                           PRE jobs/
                           PRE node/
                           PRE steps/
                           PRE task-attempts/
通常のlsと異なり、ディレクトリを見る場合には最後にスラッシュを付けないといけない。
% aws s3 ls s3://XXXXXX/j-AAAAAAAAAAA/steps/1/
2014-05-27 17:30:19       1135 controller
2014-05-27 17:27:18          0 stderr
2014-05-27 17:27:18        154 stdout
2014-05-27 17:30:19       7302 syslog
hadoopのコマンド?ログ
% aws s3 cp s3://XXXXXX/j-AAAAAAAAAAA/steps/1/controller .
download: s3://XXXXXX/j-AAAAAAAAAAA/steps/1/controller to ./controller
もっと役に立ちそうな、syslog
% aws s3 cp s3://XXXXXX/j-AAAAAAAAAAA/steps/1/syslog .
download: s3://XXXXXX/j-AAAAAAAAAAA/steps/1/syslog to ./syslog
中身をちら見。
2014-05-27 08:22:05,911 INFO org.apache.hadoop.mapred.JobClient (main): Default number of map tasks: null
2014-05-27 08:22:05,911 INFO org.apache.hadoop.mapred.JobClient (main): Setting default number of map tasks based on cluster size to : 36
2014-05-27 08:22:05,911 INFO org.apache.hadoop.mapred.JobClient (main): Default number of reduce tasks: 15
...
2014-05-27 08:22:20,419 INFO org.apache.hadoop.streaming.StreamJob (main):  map 0%  reduce 0%
2014-05-27 08:23:02,665 INFO org.apache.hadoop.streaming.StreamJob (main):  map 1%  reduce 0%
...
2014-05-27 08:24:08,927 INFO org.apache.hadoop.streaming.StreamJob (main):  map 71%  reduce 0%
2014-05-27 08:24:09,930 INFO org.apache.hadoop.streaming.StreamJob (main):  map 76%  reduce 1%
...
2014-05-27 08:24:18,969 INFO org.apache.hadoop.streaming.StreamJob (main):  map 99%  reduce 11%
2014-05-27 08:24:21,980 INFO org.apache.hadoop.streaming.StreamJob (main):  map 100%  reduce 11%
2014-05-27 08:24:23,987 INFO org.apache.hadoop.streaming.StreamJob (main):  map 100%  reduce 12%
...
2014-05-27 08:24:51,124 INFO org.apache.hadoop.streaming.StreamJob (main):  map 100%  reduce 93%
2014-05-27 08:24:52,133 INFO org.apache.hadoop.streaming.StreamJob (main):  map 100%  reduce 100%
クラスタサイズは36で、Map数はそれに基づいて決めらた、とかが出力されている。起動からマップタスク開始まで15秒程度、そこからMapタスクが完了するまで2分程度、さらにそこからReduceタスクが完了するまで、30秒ほどということがわかる。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。