ビジネスワークロードに変動があり、そのパターンを把握している場合は、スケーリングルールを設定することでオートスケーリングを有効にできます。E-MapReduce (EMR) は、ワークロードの変化に基づいてタスクノードを自動的に追加または削除することで、ジョブの完了を保証し、コストを削減します。このトピックでは、カスタムオートスケーリングポリシーの設定方法について説明します。
前提条件
-
DataLake、Dataflow、OLAP、DataServing、または Custom クラスターが作成済みであること。詳細については、「クラスターの作成」をご参照ください。
-
クラスター内に、従量課金またはプリエンプティブルインスタンスを使用するタスクノードグループが作成済みであること。詳細については、「ノードグループの作成」をご参照ください。
制限事項
-
ECS の在庫不足によるスケールアウトの失敗を減らすため、ノードグループの作成時に複数のインスタンスタイプを指定できます。代替として、最大 10 個の ECS インスタンスタイプを選択できます。システムは、リストの先頭にあるインスタンスタイプから順にインスタンスのプロビジョニングを試みます。インスタンスタイプが利用できない場合、リクエストが満たされるまで自動的に次のインスタンスタイプを試します。実際に購入されるインスタンスタイプは、在庫の変動により異なる場合があります。
-
負荷ベースのスケーリングルールは、YARN サービスがデプロイされているクラスターでのみサポートされます。
注意事項
-
ルールがトリガーされると、ノードグループは事前定義されたポリシーに基づいて自動的にスケーリングします。ルールがない場合、オートスケーリングは行われません。
-
システムは、選択したインスタンスタイプに一致するインスタンスを自動的に検索し、候補としてリストアップします。これらのインスタンスタイプを使用してスケーリングを有効にするには、これらの候補から選択する必要があります。
複数のスケーリングルールが同時にトリガーされた場合、システムは次の優先順位に基づいてルールを実行します。
-
スケールアウトルールは、スケールインルールに優先します。
-
時間ベースのルールと負荷ベースのルールは、トリガーされた順序で実行されます。
-
負荷ベースのスケーリングでは、ルールはメトリックのトリガー時刻順にソートされます。
-
負荷ベースのスケーリングでは、同じメトリックに基づくルールは、作成された順序でトリガーされます。
手順
方法1:既存クラスターのルール設定
-
Auto Scaling ページに移動します。
-
EMR on ECS コンソールにログインします。
-
上部メニューで、要件に基づいてリージョンと リソースグループ を選択します。
-
対象クラスターの名前をクリックします。
-
表示されたページで、Auto Scaling タブをクリックします。
-
-
スケーリングルールを設定します。
-
Configure Auto Scaling タブの Auto Scaling ルールの設定 セクションで カスタム Auto Scaling ルール をクリックし、再設定 を選択してから、対象ノードグループの 操作 列にある 編集 をクリックします。
-
Configure Auto Scaling パネルで、パラメーターを設定します。
-
Limits on Node Quantity of Current Node Group:グループ内のノード数を制御して、オートスケーリング中にノード数が過剰または過小になるのを防ぎます。この設定を変更するには、Modify Limit をクリックします。
-
Maximum Number of Instances:現在のノードグループの最大ノード数です。この上限に達すると、ノードグループはスケールアウトを停止します。
-
Minimum Number of Instances:現在のノードグループの最小ノード数です。この下限に達すると、ノードグループはスケールインを停止します。
-
-
Trigger Rule:現在のノードグループのスケーリングルールを表示および設定します。
-
時間ベースのスケーリング
クラスターのコンピューティングワークロードに予測可能なピークと谷がある場合、毎日、毎週、または毎月の決まった時間に特定数のタスクノードをスケールアウトするように設定できます。これにより、必要なときにコンピューティングリソースが追加され、ジョブの完了を保証しつつコストを節約できます。スケーリングルールは、スケールアウトルールとスケールインルールに分かれています。
重要競合を防ぎ、円滑なスケーリングを確保するために、スケールアウトルールとスケールインルールの実行時間を同一に設定しないでください。
このセクションでは、スケールアウトルールを例に説明します。
パラメーター
説明
[Scale-out type]
時間ベースのスケールアウト。
ルール名
スケーリングルール名は、クラスター内で一意である必要があります。
[Frequency]
-
Execute Repeatedly:毎日、毎週、または毎月の特定の時間にスケーリングアクションが実行されます。
-
Execute Only Once:指定された時間に一度だけスケーリングアクションが実行されます。
実行時間
ルールが実行される時間。
[Rule Expiration Time]
Frequency を Execute Repeatedly に設定した場合、ルールの有効期限を設定できます。この時刻を過ぎると、ルールはスケーリングアクティビティをトリガーしなくなります。
[Retry Time Range]
スケーリングアクションは、さまざまな理由で予定時刻に実行されない場合があります。再試行時間範囲を設定すると、システムはこの範囲内で成功するまで 30 秒ごとにアクションを再試行します。値は 0〜3,600 秒の範囲で設定できます。
たとえば、アクション A がスケジュールされているものの、別のアクション B が進行中またはクールダウン期間中であるために実行できない場合、システムは指定された再試行時間範囲内で 30 秒ごとにアクション A を再試行します。実行可能になり次第、アクションはすぐに実行されます。
[Nodes for each scale-out]
ルールがトリガーされたときに追加するノードの数。
[ベストエフォート式デリバリー]
この機能を有効にすることを推奨します。ベストエフォートデリバリーを有効にすると、システムは可能な限り多くのノードを提供し、円滑な業務運用を保証します。
たとえば、毎日 00:00 に 100 ノードをスケールアウトするようにシステムを設定したとします。在庫が 90 ノードしかない場合、通常はプロセスが失敗します。この機能を有効にすると、利用可能な 90 ノードが提供されます。
-
-
負荷ベースのスケーリング
説明この機能は、クラスターに YARN サービスがデプロイされている場合にのみ利用できます。
ビッグデータコンピューティングのワークロードのピークと谷を正確に予測できないが、ビジネスモデルに精通している場合は、負荷ベースのスケーリングを使用できます。スケーリングルールは、スケールアウトルールとスケールインルールに分かれています。このセクションでは、スケールアウトルールを例に説明します。
パラメーター
説明
[Scale-out type]
負荷ベースのスケールアウト。
ルール名
スケーリングルール名は、クラスター内で一意である必要があります。
Load Metric-based Trigger Conditions
負荷ベースのスケーリングルールをトリガーする条件です。システム定義の負荷メトリックを 1 つ以上選択する必要があります。複数のメトリックを選択するには、Add Metric をクリックします。次のパラメーターが含まれます:
-
負荷メトリック:システムでサポートされている負荷メトリックの名前。E-MapReduce のオートスケーリングメトリックと YARN サービスメトリックのマッピングの詳細については、「E-MapReduce のオートスケーリングメトリックと YARN サービスメトリックのマッピング」をご参照ください。
説明サポートされる負荷メトリックはクラスタータイプによって異なります。コンソールに実際に表示されるメトリックが優先されます。
-
集計方法:統計期間における負荷メトリックを、しきい値と比較評価するための方法 (平均、最大、または最小) です。集計値がしきい値を満たすと、ルールがトリガーされます。
Multi-metric Relationship
All Metrics Meet the Conditions または Any Metric Meets the Condition を選択できます。
[Statistical Period]
メトリックの収集と集計のための時間枠です。期間が短いほど、ルールは負荷の変動に敏感になります。業務内容に合わせて、適切な統計期間を選択してください。
[Condition Repetition Threshold]
ルールがトリガーされる前に、メトリックがしきい値を超えなければならない連続した統計期間の数。これにより、一時的な急上昇によるスケーリングを防ぎます。
[Nodes for each scale-out]
ルールがトリガーされたときに追加するノードの数。
[ベストエフォート式デリバリー]
この機能を有効にすると、システムは可能な限り多くのノードを提供します。負荷ベースのスケーリングでこの機能を有効にするかどうかを評価してください。必要なキャパシティが判明している時間ベースのスケーリングとは異なり、負荷ベースのスケーリングはメトリックに応じて動作するため、一部のリソースのみが提供されることは望ましくない場合があります。
[Cooldown Time]
オートスケーリングアクティビティの開始から、次のアクティビティが開始できるまでの間隔です。この期間中、すべてのスケーリングトリガーは無視されます。クールダウンが終了すると、システムはスケーリング条件を満たす新しいトリガーにのみ応答します。
このクールダウン期間は、次のスケーリングイベントが開始される前にシステム負荷が安定するための時間を確保します。
[Effective Time Period]
負荷ベースのスケーリングルールが有効な時間範囲を指定するオプションのパラメーターです。デフォルトでは、ルールは常時有効です。時間範囲を設定すると、スケーリングアクティビティはその範囲内でのみトリガーされます。
-
-
-
-
設定が完了したら、Save and Apply をクリックします。
条件が満たされると、ノードグループでオートスケーリングアクティビティがトリガーされます。
-
方法2:クラスター作成時のルール設定
-
EMR on ECS コンソールにログインします。
-
上部メニューで、要件に基づいてリージョンと リソースグループ を選択します。
-
CREATE_CLUSTER をクリックします。パラメーターの詳細については、「クラスターの作成」をご参照ください。
説明対応するルールを設定する前に、従量課金のタスクノードグループをクラスターに追加する必要があります。
-
クラスターのスケーリング を設定します。
-
カスタム Auto Scaling ルール を選択し、対象ノードグループの 操作 列にある 編集 をクリックします。
-
Configure Auto Scaling パネルで、パラメーターを設定します。詳細については、「スケーリングルールの設定」をご参照ください。
-
設定が完了したら、Save and Apply をクリックします。
-
-
注文を確認し、クラスターを作成します。
クラスターが作成された後、ルール条件が満たされるとノードグループでスケーリングアクティビティがトリガーされます。
方法3:SDK を使用したルール設定
クラスターまたはノードグループを作成する際に、ノードグループのカスタムスケーリングルールを設定して、ノードの作成と管理を自動化できます。詳細については、「クラスターの作成」および「ノードグループの作成」をご参照ください。既存のノードグループにカスタムスケーリングルールを設定することもできます。詳細については、「カスタム自動スケーリングポリシーの作成」をご参照ください。
次の Java コードは、負荷ベースのスケールアウトルールを設定する例です。
より安全な STS 方式を使用してクライアントを初期化することを推奨します。認証方法の詳細については、「アクセス資格情報の管理」をご参照ください。
// このファイルは自動生成されたものです。編集しないでください。
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>AccessKey ペアを使用してクライアントを初期化します。</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.emr20210320.Client createClient() throws Exception {
// ソースコードが漏洩すると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティ上のリスクとなります。以下のコードは参照用です。
// より安全なSTS方式による認証を推奨します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必須: ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が設定されていることを確認してください。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必須: ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// エンドポイントについては、https://api.alibabacloud.com/product/Emr をご参照ください。
config.endpoint = "emr.eu-central-1.aliyuncs.com";
return new com.aliyun.emr20210320.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.emr20210320.Client client = Sample.createClient();
com.aliyun.emr20210320.models.ScalingConstraints scalingConstraints = new com.aliyun.emr20210320.models.ScalingConstraints()
.setMaxCapacity(10)
.setMinCapacity(0);
com.aliyun.emr20210320.models.TriggerCondition scalingRule0MetricsTriggerTriggerCondition0 = new com.aliyun.emr20210320.models.TriggerCondition()
.setMetricName("yarn_resourcemanager_queue_AvailableVCoresPercentage")
.setStatistics("AVG")
.setComparisonOperator("LE")
.setThreshold(15D);
com.aliyun.emr20210320.models.TriggerCondition scalingRule0MetricsTriggerTriggerCondition1 = new com.aliyun.emr20210320.models.TriggerCondition()
.setMetricName("yarn_resourcemanager_queue_AvailableMBPercentage")
.setStatistics("AVG")
.setComparisonOperator("LE")
.setThreshold(15D);
com.aliyun.emr20210320.models.MetricsTrigger scalingRule0MetricsTrigger = new com.aliyun.emr20210320.models.MetricsTrigger()
.setTimeWindow(300)
.setEvaluationCount(1)
.setCoolDownInterval(300)
.setConditionLogicOperator("Or")
.setConditions(java.util.Arrays.asList(
scalingRule0MetricsTriggerTriggerCondition0,
scalingRule0MetricsTriggerTriggerCondition1
));
com.aliyun.emr20210320.models.ScalingRule scalingRule0 = new com.aliyun.emr20210320.models.ScalingRule()
.setRuleName("default")
.setTriggerType("METRICS_TRIGGER")
.setActivityType("SCALE_OUT")
.setAdjustmentValue(1)
.setMetricsTrigger(scalingRule0MetricsTrigger);
com.aliyun.emr20210320.models.PutAutoScalingPolicyRequest putAutoScalingPolicyRequest = new com.aliyun.emr20210320.models.PutAutoScalingPolicyRequest()
.setRegionId("cn-hangzhou")
.setClusterId("c-xxxx")
.setNodeGroupId("ng-xxx")
.setScalingRules(java.util.Arrays.asList(
scalingRule0
))
.setConstraints(scalingConstraints);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// API の戻り値はご自身で出力してください。
client.putAutoScalingPolicyWithOptions(putAutoScalingPolicyRequest, runtime);
} catch (TeaException error) {
// 以下のコードはデモ用です。実際のプロジェクトでは、例外を無視せず慎重に処理することを推奨します。
// エラーメッセージ
System.out.println(error.getMessage());
// 診断アドレス
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception exception) {
TeaException error = new TeaException(exception.getMessage(), exception);
// 以下のコードはデモ用です。実際のプロジェクトでは、例外を無視せず慎重に処理することを推奨します。
// エラーメッセージ
System.out.println(error.getMessage());
// 診断アドレス
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
E-MapReduce (EMR) 自動スケーリングメトリックと YARN メトリックのマッピング
-
キュー関連の自動スケーリングメトリックの場合、
queue_nameパラメーターを指定します。デフォルト値はルートです。カスタムキューも使用できます。 -
パーティション関連の自動スケーリングメトリックの場合、
partition_nameパラメーターを指定する必要があります。
|
E-MapReduce (EMR) メトリック |
サービス |
説明 |
|
yarn_resourcemanager_queue_AvailableVCores |
YARN |
指定されたキューで使用可能な仮想 CPU コアの数。 |
|
yarn_resourcemanager_queue_PendingVCores |
YARN |
指定されたキューで待機中の仮想 CPU コアの数。 |
|
yarn_resourcemanager_queue_AllocatedVCores |
YARN |
指定されたキューで割り当て済みの仮想 CPU コアの数。 |
|
yarn_resourcemanager_queue_ReservedVCores |
YARN |
指定されたキューで予約済みの仮想 CPU コアの数。 |
|
yarn_resourcemanager_queue_AvailableMB |
YARN |
指定されたキューで使用可能なメモリの量。 |
|
yarn_resourcemanager_queue_PendingMB |
YARN |
指定されたキューで待機中のメモリの量。 |
|
yarn_resourcemanager_queue_AllocatedMB |
YARN |
指定されたキューで割り当て済みのメモリの量。 |
|
yarn_resourcemanager_queue_ReservedMB |
YARN |
指定されたキューで予約済みのメモリの量。 |
|
yarn_resourcemanager_queue_AppsRunning |
YARN |
指定されたキューで実行中のアプリケーションの数。 |
|
yarn_resourcemanager_queue_AppsPending |
YARN |
指定されたキューで待機中のアプリケーションの数。 |
|
yarn_resourcemanager_queue_AppsKilled |
YARN |
指定されたキューで強制終了されたアプリケーションの数。 |
|
yarn_resourcemanager_queue_AppsFailed |
YARN |
指定されたキューで失敗したアプリケーションの数。 |
|
yarn_resourcemanager_queue_AppsCompleted |
YARN |
指定されたキューで完了したアプリケーションの数。 |
|
yarn_resourcemanager_queue_AppsSubmitted |
YARN |
指定されたキューで送信済みのアプリケーションの数。 |
|
yarn_resourcemanager_queue_AllocatedContainers |
YARN |
指定されたキューで割り当て済みのコンテナの数。 |
|
yarn_resourcemanager_queue_PendingContainers |
YARN |
指定されたキューで待機中のコンテナの数。 |
|
yarn_resourcemanager_queue_ReservedContainers |
YARN |
指定されたキューで予約済みのコンテナの数。 |
|
yarn_resourcemanager_queue_AvailableMBPercentage |
YARN |
指定されたキューで使用可能なメモリリソースのパーセンテージ: 説明
このメトリックは、E-MapReduce (EMR)-3.43.0 以降のバージョンおよび E-MapReduce (EMR)-5.9.0 以降のバージョンで利用できます。 |
|
yarn_resourcemanager_queue_PendingContainersRatio |
YARN |
指定されたキューで待機中のコンテナ数と割り当て済みのコンテナ数の比率: 説明
このメトリックは、E-MapReduce (EMR)-3.43.0 以降のバージョンおよび E-MapReduce (EMR)-5.9.0 以降のバージョンで利用できます。 |
|
yarn_resourcemanager_queue_AvailableVCoresPercentage |
YARN |
指定されたキューで使用可能な仮想 CPU コアのパーセンテージ: 説明
このメトリックは、E-MapReduce (EMR)-3.43.0 以降のバージョンおよび E-MapReduce (EMR)-5.9.0 以降のバージョンで利用できます。 |
|
yarn_cluster_numContainersByPartition |
YARN |
指定されたパーティション内のコンテナの数。 説明
このメトリックは、E-MapReduce (EMR)-3.44.0 以降のバージョンおよび E-MapReduce (EMR)-5.10.0 以降のバージョンで利用できます。 |
|
yarn_cluster_usedMemoryMBByPartition |
YARN |
指定されたパーティションのメモリ使用量。 説明
このメトリックは、E-MapReduce (EMR)-3.44.0 以降のバージョンおよび E-MapReduce (EMR)-5.10.0 以降のバージョンで利用できます。 |
|
yarn_cluster_availMemoryMBByPartition |
YARN |
指定されたパーティションで使用可能なメモリ。 説明
このメトリックは、E-MapReduce (EMR)-3.44.0 以降のバージョンおよび E-MapReduce (EMR)-5.10.0 以降のバージョンで利用できます。 |
|
yarn_cluster_usedVirtualCoresByPartition |
YARN |
指定されたパーティションで使用中の仮想 CPU コアの数。 説明
このメトリックは、E-MapReduce (EMR)-3.44.0 以降のバージョンおよび E-MapReduce (EMR)-5.10.0 以降のバージョンで利用できます。 |
|
yarn_cluster_availableVirtualCoresByPartition |
YARN |
指定されたパーティションで使用可能な仮想 CPU コアの数。 説明
このメトリックは、E-MapReduce (EMR)-3.44.0 以降のバージョンおよび E-MapReduce (EMR)-5.10.0 以降のバージョンで利用できます。 |