EMRのステップのキャンセルについて

Amazon EMR

今回はEMRのステップ、つまりHiveやSparkなどのジョブのキャンセル方法について紹介します。以前紹介した以下のHadoop Streamingジョブを例にキャンセル方法について紹介します。

EMRで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ジョブはステータスが実行中であるため[ステップをキャンセル]ボタンが無効になっています。

cancel-emr-step_1

実行前はキャンセルできる

次に実行前のジョブについてキャンセルしてみましょう。WordCount2ジョブはステータスが保留中であるため[ステップをキャンセル]ボタンが有効になっています。そこでクリックするとステップをキャンセルできます。 cancel-emr-step_2

SSHでログインしてジョブを停止する

最後に実行中のステップを停止してみましょう。まずは事前状態の確認です。WordCount1ジョブは完了し、WordCount2ジョブはキャンセルされ、WordCount3ジョブが実行中になっています。そのため、WordCount3ジョブを停止します。

cancel-emr-step_3

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ステップのステータスが失敗になっていることが確認できます。

cancel-emr-step_4

yarn application コマンドと hadoop job コマンドの違いについて

今回のエントリーはAWS Support – Knowledge CenterCancel 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したことがあったのを思い出したので書いてみました。参考になれば幸いです。

脚注

  1. 実際にはhadoop jobコマンドはDeprecatedになっていて、mapred jobコマンドの利用が推奨されています。Hadoop 2.7.3でもhadoop jobコマンドは利用できますが、ドキュメント上では2.6.2まではDeprecatedの記載があり、2.7.0からはjobコマンドに関する記載そのものがなくなっています。