如何配置EMR集群自动扩缩容,确保按需实例不超上限?
解决EMR托管扩缩容按需实例超配问题
问题根源
当前配置仅限制了按需实例总数上限,但未指定优先保留的基础按需实例数量,EMR托管扩缩容逻辑在Spot实例资源紧张或重新调度时,可能会用按需实例补充任务节点,打破预期配额。
调整方案
1. 修改托管扩缩容策略,锁定基础按需实例
在aws_emr_managed_scaling_policy资源中新增ondemand_base_capacity_units参数并设为2,该参数会强制EMR先启动2个按需实例(1主+1核心),后续扩缩容仅通过Spot实例填充任务节点:
resource "aws_emr_managed_scaling_policy" "my_aws_emr_managed_scaling_policy" { cluster_id = var.amazon_emr_cluster_id compute_limits { unit_type = "InstanceFleetUnits" minimum_capacity_units = 2 maximum_capacity_units = 10 ondemand_base_capacity_units = 2 # 新增:锁定基础按需实例数量 maximum_ondemand_capacity_units = 2 # 限制总按需实例不超2 maximum_core_capacity_units = 1 } }
2. 强制任务实例组仅使用Spot
在任务实例组配置中,将target_on_demand_capacity设为0,从实例组层面彻底禁用按需实例,避免扩缩容逻辑 fallback 到按需:
# 整合到EMR集群资源中的任务实例组配置 resource "aws_emr_instance_fleet" "task" { cluster_id = aws_emr_cluster.my_cluster.id instance_fleet_type = "TASK" instance_type_configs { instance_type = "m5.xlarge" spot_price = "0.03" # 按需设置你的Spot出价 weighted_capacity = 1 bid_price_as_percentage_of_on_demand_price = 100 } target_on_demand_capacity = 0 # 任务节点绝不使用按需实例 target_spot_capacity = 1 # 初始Spot任务节点数量 }
3. 确认核心实例组配置
核心实例组保持固定1个按需实例,不启用Spot,避免占用按需配额:
resource "aws_emr_instance_fleet" "core" { cluster_id = aws_emr_cluster.my_cluster.id instance_fleet_type = "CORE" instance_type_configs { instance_type = "m5.xlarge" weighted_capacity = 1 } target_on_demand_capacity = 1 # 固定1个按需核心实例 target_spot_capacity = 0 # 核心节点不使用Spot }
生效逻辑
ondemand_base_capacity_units=2确保EMR始终保留1主1核心这2个按需实例,后续扩缩容仅补充Spot任务节点。maximum_ondemand_capacity_units=2从集群层面锁死按需实例总数,防止任何场景下超配。- 任务实例组的
target_on_demand_capacity=0是双重保险,直接从实例组层面拒绝按需实例调度。
内容的提问来源于stack exchange,提问作者Hongbo Miao
相关产品推荐
相关产品推荐

