EMRのステップのキャンセルについて
今回はEMRのステップ、つまりHiveやSparkなどのジョブのキャンセル方法について紹介します。以前紹介した以下のHadoop Streamingジョブを例にキャンセル方法について紹介します。
結論
先に結論を書いておきます。EMRの場合、ジョブはステップという単位で管理されるようになっています。このステップは実際に処理が開始される前はキャンセルすることが可能ですが、一旦処理が開始されるとキャンセルできません。処理が開始されている場合はマスターノードにSSHでログインしてyarn application
コマンドを利用してジョブを停止する必要があります。
実行環境
- emr-5.6.0 でアプリケーションは Hadoop のみ
- Hadoop 2.7.3
- ハードウェア構成は m1.medium を 1 台(検証用なのでマスターノードのみ)
- 東京リージョン
EMRクラスタの作成
まずはEMRクラスタを作成します。AWS CLIを利用する場合は以下のようなコマンドになります。KeyName
, SubnetId
, log-uri
を自身の環境に合わせて書き換えて下さい。
aws emr create-cluster --auto-scaling-role EMR_AutoScaling_DefaultRole --applications Name=Hadoop \ --ec2-attributes '{"KeyName":"XXXX","InstanceProfile":"EMR_EC2_DefaultRole","SubnetId":"subnet-XXXX"}' \ --service-role EMR_DefaultRole --enable-debugging --release-label emr-5.6.0 \ --log-uri 's3n://aws-logs-XXXX-ap-northeast-1/elasticmapreduce/' --name 'cancel-steps' \ --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","InstanceType":"m1.medium","Name":"Master Instance Group"}]' \ --scale-down-behavior TERMINATE_AT_INSTANCE_HOUR --region ap-northeast-1
実際に実行すると作成したEMRクラスタのClusterId
が表示されます。ClusterId
はジョブを実行する際に利用するので控えておいて下さい。
$ aws emr create-cluster ... { "ClusterId": "j-XXXXXX" }
ステップを登録
次にHadoop Streamingジョブのステップを登録します。今回はキャンセル操作を試せるようにWordCountを実行するステップを3つ登録します。s3_bucket_name
, emr_cluster_id
を自身の環境に合わせて書き換えて下さい。
s3_bucket_name=your_bucket_name emr_cluster_id=your_cluster_id for ((i=1; i <= 3; i++)); do step_name=WordCount${i} aws emr add-steps --cluster-id ${emr_cluster_id} --steps Type=STREAMING,Name="${step_name}",ActionOnFailure=CONTINUE,Args=[-files,s3://ap-northeast-1.elasticmapreduce.samples/wordcount/code/wordSplitter.py,-mapper,wordSplitter.py,-reducer,aggregate,-input,s3://ap-northeast-1.elasticmapreduce.samples/wordcount/data,-output,s3://${s3_bucket_name}/${step_name}] --region ap-northeast-1 done
実行中はキャンセルできない
まずは実行中のジョブがキャンセル出来ないことの確認です。マネジメントコンソールを開き、クラスタのステップを表示して下さい。以下の例ですとWordCount1ジョブはステータスが実行中であるため[ステップをキャンセル]ボタンが無効になっています。
実行前はキャンセルできる
次に実行前のジョブについてキャンセルしてみましょう。WordCount2ジョブはステータスが保留中であるため[ステップをキャンセル]ボタンが有効になっています。そこでクリックするとステップをキャンセルできます。
SSHでログインしてジョブを停止する
最後に実行中のステップを停止してみましょう。まずは事前状態の確認です。WordCount1ジョブは完了し、WordCount2ジョブはキャンセルされ、WordCount3ジョブが実行中になっています。そのため、WordCount3ジョブを停止します。
EMRのマスターノードにSSHでログインしてHadoop Streamingジョブを停止します。そのため、EC2サービス等でEMRのマスターノードにSSHできるようにセキュリティグループの設定を実施して下さい。詳細な手順はSSH を使用してマスターノードに接続する - Amazon EMRを参照して下さい。
SSHでマスターノードに接続しyarn application -list
コマンドを実行して下さい。このコマンドで実行中のYARNアプリケーションの一覧を表示することが出来ます。
[hadoop@ip-172-31-28-122 ~]$ yarn application -list 17/07/06 11:36:48 INFO impl.TimelineClientImpl: Timeline service address: http://ip-172-31-28-122.ap-northeast-1.compute.internal:8188/ws/v1/timeline/ 17/07/06 11:36:49 INFO client.RMProxy: Connecting to ResourceManager at ip-172-31-28-122.ap-northeast-1.compute.internal/172.31.28.122:8032 Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):1 Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL application_1499340358324_0002 streamjob6196329770787006988.jar MAPREDUCE hadoop default RUNNING UNDEFINED 5% http://ip-172-31-28-122.ap-northeast-1.compute.internal:46709
Application-TypeがMAPREDUCEであるアプリケーションが1件表示されたかと思います。これがWordCount3です。ではyarn application -kill
コマンドでジョブを停止しましょう。引数にはApplication-Idを指定して下さい。
[hadoop@ip-172-31-28-122 ~]$ yarn application -kill application_1499340358324_0002 17/07/06 11:37:25 INFO impl.TimelineClientImpl: Timeline service address: http://ip-172-31-28-122.ap-northeast-1.compute.internal:8188/ws/v1/timeline/ 17/07/06 11:37:27 INFO client.RMProxy: Connecting to ResourceManager at ip-172-31-28-122.ap-northeast-1.compute.internal/172.31.28.122:8032 Killing application application_1499340358324_0002 17/07/06 11:37:30 INFO impl.YarnClientImpl: Killed application application_1499340358324_0002
ジョブが停止できたか確認しましょう。再度yarn application -list
コマンドを実行して、結果が0行であることを確認して下さい。
[hadoop@ip-172-31-28-122 ~]$ yarn application -list 17/07/06 11:37:39 INFO impl.TimelineClientImpl: Timeline service address: http://ip-172-31-28-122.ap-northeast-1.compute.internal:8188/ws/v1/timeline/ 17/07/06 11:37:39 INFO client.RMProxy: Connecting to ResourceManager at ip-172-31-28-122.ap-northeast-1.compute.internal/172.31.28.122:8032 Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):0 Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
マネジメントコンソール上でもWordCount3ステップのステータスが失敗になっていることが確認できます。
yarn application コマンドと hadoop job コマンドの違いについて
今回のエントリーはAWS Support – Knowledge CenterのCancel an EMR Stepを参考にしています。こちらのエントリーではhadoop job
コマンドを利用するように記載されていますが、今回のエントリーではyarn application
コマンドによる手順を紹介しました。そのため、yarn application
コマンドとhadoop job
コマンドの違いについても説明しておきます。
まずhadoop job
コマンドですが、こちらはHadoop 1から存在するコマンドでMapReduceジョブを操作するためのコマンドです。一方、yarn application
コマンドはHadoop 2で登場したYARNアプリケーションを操作するためのコマンドです。SparkやTezはYARNアプリケーションとして実装されているため、yarn application
コマンドで操作できますが、hadoop job
コマンドで操作することが出来ません。そのためyarn application
コマンドを利用して下さい。
なお、Hadoop StreamingジョブについてはMapReduceベースで実装されているためhadoop job
コマンドで操作することも可能です *1。ですがHadoop 2からはMapReduceについてもYARNアプリケーションとして実装されているのでyarn application
コマンドで操作できます。
最後に
Cancel an EMR Stepを読んだ際に、そういえば実行中のステップのキャンセル操作ができなくてSSHでログインしてジョブをkillしたことがあったのを思い出したので書いてみました。参考になれば幸いです。
脚注
- 実際にはhadoop jobコマンドはDeprecatedになっていて、mapred jobコマンドの利用が推奨されています。Hadoop 2.7.3でもhadoop jobコマンドは利用できますが、ドキュメント上では2.6.2まではDeprecatedの記載があり、2.7.0からはjobコマンドに関する記載そのものがなくなっています。 ↩