【AWS】Amazon EMR ~ Auto scaling ~

■ はじめに

Amazon EMR の 自動スケーリングについて、不勉強なので
調べてまとめた

目次

【0】EMRの スケーリング方法
 1)使用上の注意
 2)比較
 3)使い分け
【1】EMR-managed scaling
 1)使用上の注意
【2】Custom automatic scaling policy
 1)使用上の注意
 2)使用するメトリクス
 3)設定手順
【3】自動スケーリングポリシーのイベント
 1)PENDING(待ち状態)
 2)ATTACHED(スケーリングしている)
 3)DETACHED(スケーリング解除)
 4)FAILED(失敗)
【4】GUIでの確認について
 1)設定の確認
 2)EMRの各種イベントの確認
【5】トラブルシューティング
 1)トラブル実例
 2)切り分けのヒント : aws emr describe-cluster
【6】補足:用語整理
 1)スケールアウト(Scale out)
 2)スケールイン(Scale in)

【0】EMRの スケーリング方法

https://aws.amazon.com/jp/premiumsupport/knowledge-center/auto-scaling-in-amazon-emr/
https://aws.amazon.com/jp/blogs/news/introducing-amazon-emr-managed-scaling-automatically-resize-clusters-to-lower-cost/

にある通り、クラスターをスケーリングするのに
以下の 2 つの方法を提供している。

【1】EMR-managed scaling(EMR マネージドスケーリング)
【2】Custom automatic scaling policy(カスタム自動スケーリング)

1)使用上の注意

[1] マスターノード数を、スケーリングできない
 => スケーリングするのは、クラスター内の「コアノード」と「タスクノード」のみ

[2] インスタンスグループの「再設定」と「サイズ変更」を同時に行えない
 => インスタンスグループのサイズ変更中に再設定を開始した場合、
  インスタンスグループのサイズ変更が完了するまで
  再設定を開始することはできない
  その逆も同様。

2)比較

https://aws.amazon.com/jp/blogs/news/introducing-amazon-emr-managed-scaling-automatically-resize-clusters-to-lower-cost/
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-scale-on-demand.html

より一部抜粋
- EMR-managed scaling Custom scaling
ポリシーとルール 不要 ポリシーとルールを定義/管理する必要がある
サポートしているるクラスタタイプ インスタンスグループ/インスタンスフリート インスタンスグループのみ
設定の粒度 クラスターレベルの最小/最大制約 インスタンスグループのみ
サポートしているEMR version 5.30+ (ただし6.0.0除く) 4.0+
メトリクス収集頻度 1 ~ 5 秒ごと 5 分ごと
評価頻度 5 ~ 10 秒ごと 5 分ごと

3)使い分け

* 基本的には、「【1】EMR-managed scaling」でいいのかなっと思う
 (理由は後述「【1】EMR-managed scaling」に記載)が、
 以下により異なる

 + 使用しているEMRバージョン(古すぎてたら、どっちも使えない)

【1】EMR-managed scaling

* EMR マネージドスケーリング
* EMR マネージドスケーリングを有効にすると、
 ワークロードに基づいてクラスター内のインスタンス/ユニット数を
 自動的に増減する

個人的な意見

* 面倒な設定(ポリシー)も不要なので管理コストを軽減できるし、
 評価頻度も細かくできるので、設計する際は、
 「【1】EMR-managed scaling」ベースに考えればよさそう

1)使用上の注意

* EMR5.30.0 / 6.1.0 以上(未満だと使えない)

【2】Custom automatic scaling policy

* カスタム自動スケーリング
* インスタンスグループのカスタムポリシーで自動スケーリングを使用

1)使用上の注意

* EMR5.30.0 / 6.1.0 以上(未満だと使えない)

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-automatic-scaling.html

より抜粋
~~~~~~
(i) 注記
Amazon EMR でカスタムポリシー機能による自動スケーリングを使用するには、
クラスターの作成時に VisibleToAllUsers パラメータに true を設定する必要があります。
詳細については、「SetVisibleToAllUsers」を参照してください。
~~~~~~

SetVisibleToAllUsers
https://docs.aws.amazon.com/ja_jp/emr/latest/APIReference/API_SetVisibleToAllUsers.html

2)使用するメトリクス

* 自動スケーリングで一般的に使用されるメトリクスは以下の通り。

[a] YarnMemoryAvailablePercentage

* YARN で使用可能な残りメモリの割合(%)

[b] ContainerPendingRatio

* 「保留中のコンテナ」と「割り当てられたコンテナ」の比率

3)設定手順

* 以下の公式ドキュメントを見るといいかも。

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-automatic-scaling.html

~~~~~
[1] 自動スケーリングの IAM ロールを作成する
[2] 自動スケーリングルール作成・設定
~~~~~

[1] 自動スケーリングの IAM ロールを作成する
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-automatic-scaling.html#emr-automatic-scaling-iam-role

より
~~~~~
* Amazon EMR での自動スケーリングには、
 スケーリングアクティビティがトリガーされたときに
 インスタンスを追加および削除する権限がある IAM ロールが必要
 => デフォルトロールである EMR_AutoScaling_DefaultRole は、
  適切なロールポリシーと信頼ポリシーで設定されており、
  この目的に使用できる

* スケーリングポリシーを持つクラスターを最初に作成するとき、
 Amazon EMR はデフォルトのロールを作成し、
 アクセス許可に必要なデフォルトの管理ポリシー
  AmazonElasticMapReduceforAutoScalingRole をアタッチ
~~~~~

[2] 自動スケーリングルール作成・設定

* 以下の公式ドキュメントを参照(イメージも載っている)

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-automatic-scaling.html#emr-scaling-rules

【3】自動スケーリングポリシーのイベント

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html#emr-cloudwatch-autoscale-events

より、以下のイベント(状態)がある

1)PENDING(待ち状態)
2)ATTACHED(スケーリングしている)
3)DETACHED(スケーリング解除)
4)FAILED(失敗)

1)PENDING(待ち状態)

* ポリシーのアタッチメントを保留している状態

2)ATTACHED(スケーリングしている)

* Amazon EMR クラスター ClusterId (clusterName) 内の
 インスタンスグループ InstanceGroupID の Auto Scaling ポリシーが
 アタッチした状態

3)DETACHED(スケーリング解除)

* Amazon EMR クラスター ClusterId (clusterName) 内の
 インスタンスグループ InstanceGroupID の Auto Scaling ポリシーが
 デタッチした状態

4)FAILED(失敗)

* Amazon EMR クラスター ClusterId (clusterName) 内の
 インスタンスグループ InstanceGroupID の Auto Scaling ポリシーは、
 アタッチ/でタッチできずに失敗した状態

【4】GUIでの確認について

1)設定の確認

* 以下の確認可能
~~~~
[1] AWS Managementコンソールで、[EMR]-[Clusters]で
 確認対象クラスターを選択する
[2] [Hardware]タブを選択すると
 「Cluster Scaling Policy」欄配下で確認できる
~~~~

* 上記のAWS Managementコンソール画面上から
 クラスターのスケーリング設定の変更が可能。

「Edit」ボタン押下

* 「Cluster Scaling」で「Enable Cluster Scaing」チェックボタンにより
 クラスターのスケーリング設定の有効/無効を切り替え可能
 => 編集を反映するには、「Save」ボタン押下を忘れずに、、、

「ペンアイコン」押下

* 設定した自動スケーリングのパラメータを編集可能

2)EMRの各種イベントの確認

* 以下の確認可能
~~~~
[1] AWS Managementコンソールで、[EMR]-[Clusters]で
 確認対象クラスターを選択する
[2] [Events]タブを選択すると、イベントが表になって確認できる
~~~~

* EMRのイベント全体を確認したい場合は、以下の通り
~~~~
[1] AWS Managementコンソールで、[EMR]-[Events]を選択する
 => フィルタリングも可能
~~~~

【5】トラブルシューティング

* 以下の公式ドキュメントが役に立ちそう

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/CHAP_Troubleshooting.html

1)トラブル実例

* 以下の関連記事を参照のこと
 => ちなみに上記の公式ドキュメントは、あまり役に立たなかった、、、

EMRで Auto Scaling が FAILED する
https://dk521123.hatenablog.com/entry/2022/05/18/092046

2)切り分けのヒント : aws emr describe-cluster

* このコマンド出力結果を元に後述「1)トラブル実例」を解決した
* このコマンド以外のEMRのAWS CLI は、以下の公式ドキュメントを参照。

https://docs.aws.amazon.com/cli/latest/reference/emr/index.html

aws emr describe-cluster コマンド
https://docs.aws.amazon.com/cli/latest/reference/emr/describe-cluster.html

* クラスターレベルの詳細を表示する
 + ステータス
 + ハードウェア・ソフトウェアの設定
 + VPC 設定
 + ブートストラップアクション
 + インスタンスグループ

* 以下の公式ドキュメントもみておくといいかも。

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-manage-view-clusters.html

【6】補足:用語整理

 「スケールイン」「スケールアウト」が
どっちでどっちだってなるので、整理。

1)スケールアウト(Scale out)

* サーバ台数を増やすこと
 => 処理分散して処理効率は上がるが、コストも上がる

2)スケールイン(Scale in)

* サーバ台数を減らすこと(「スケールアウト」の逆)

cf. スケールダウン(Scale down)

* サーバのグレード(CPUなど)を落とすこと

関連記事

Amazon EMR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/20/230519
Amazon EMR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/27/175610
Amazon EMR ~IAM Role周り ~
https://dk521123.hatenablog.com/entry/2023/07/24/160124
EMRで Auto Scaling が FAILED する
https://dk521123.hatenablog.com/entry/2022/05/18/092046