Boto3 EMR API不支持OnDemandPrice 如何通过Boto3配置EMR Spot实例
Boto3创建EMR Spark集群Spot实例组的解决方案
错误原因
你遇到的ValidationException报错是因为仅配置BidPrice参数不足以切换实例组的采购模式,EMR默认所有实例组为按需实例,给按需实例配置竞价参数就会触发校验失败。
解决方案
在实例组配置中额外添加Market字段,值设为SPOT即可指定该实例组采用Spot实例采购模式,修改后的正确配置如下:
'Name': 'Core - 2', 'InstanceRole': 'CORE', 'InstanceType': 'i3.2xlarge', 'InstanceCount': 50, 'Market': 'SPOT', # 新增字段指定实例为Spot模式 'BidPrice': 'OnDemandPrice'
配置说明
Market字段可选值为ON_DEMAND(默认)和SPOT,仅当值为SPOT时才支持配置BidPrice参数BidPrice填OnDemandPrice代表以对应实例的按需价格作为竞价上限,也可填入具体数值的字符串(例如'0.3')自定义竞价上限
调用示例
完整的实例组配置在run_job_flow接口中的位置参考:
import boto3 emr_client = boto3.client('emr', region_name='your-region') response = emr_client.run_job_flow( Name='your-spark-cluster', ReleaseLabel='emr-6.10.0', # 替换为你需要的EMR版本 Instances={ 'InstanceGroups': [ # Master实例组(建议用按需) { 'Name': 'Master', 'InstanceRole': 'MASTER', 'InstanceType': 'm5.xlarge', 'InstanceCount': 1, 'Market': 'ON_DEMAND' }, # Core实例组(Spot模式) { 'Name': 'Core - 2', 'InstanceRole': 'CORE', 'InstanceType': 'i3.2xlarge', 'InstanceCount': 50, 'Market': 'SPOT', 'BidPrice': 'OnDemandPrice' } ], 'Ec2KeyName': 'your-ec2-key', 'KeepJobFlowAliveWhenNoSteps': True, 'TerminationProtected': False }, # 其他配置:应用、角色、步骤等按你原有需求补充 Applications=[{'Name': 'Spark'}, {'Name': 'Hadoop'}], JobFlowRole='EMR_EC2_DefaultRole', ServiceRole='EMR_DefaultRole' )
注意事项
- Master实例组建议保持按需实例模式,避免Spot实例回收导致集群整体不可用
- 配置完成后可通过
emr_client.describe_cluster(ClusterId='your-cluster-id')返回的InstanceGroups字段,验证实例组的采购模式和竞价配置是否生效 - 如果需要配置Spot实例的回收策略、容量优化分配等高级特性,可以在实例组配置中添加
SpotProvisioningSpecification参数做定制
内容的提问来源于stack exchange,提问作者Riley Hun
相关产品推荐
相关产品推荐

