背景
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秒ほどということがわかる。