背景
随着AWS EMR服务用户越来越多,持续运行的AWS EMR在成本优化方面会有较多限制,本文会提供一些特定情况下AWS EMR平台成本优化的一些方法和思路。本文主要包含“控制实例组资源”、“控制实例队列资源”、“控制EMR-managed scaling弹性配置”实现成本的优化,实际的使用可以根据EMR集群配置组合使用。
成本优化方法
本文方案主要为通过Lambda程序控制EMR集群数量方式节省成本,Lambda可根据计算任务低峰期和高峰期调整EMR集群实例数量,节省EMR实例费用、EBS磁盘费用、EMR服务费用。同时本文也有对EMR-managed scaling的控制,可以搭配使用节省更多成本。
可采用定时任务方式控制集群资源,该方式适合固定大小的EMR集群在指定时间的扩展和缩减,Lambda程序可以控制添加按需/竞价实例。
可结合EMR-managed scaling功能控制集群资源,该方式适合动态大小的EMR集群在指定时间的增加集群容量上限,Lambda程序可以控制扩展集群添加更多按需/竞价实例。
以下项目样例就较为适合使用本文方案进行调整,低峰期使用Lambda程序修改EMR-managed scaling的容量,在凌晨00:30定时扩展集群实例组和EMR-managed scaling配置规模,用于完成夜间计算任务所需资源,在8点完成计算任务后通过Lambda程序修改EMR-managed scaling的容量减少集群2/3资源,由EMR-managed scaling完成集群规模的缩减,可节省平台EMR实例费用、EBS磁盘费用、EMR服务费用。
配置方法
1. 定时修改实例组
通过定时执行Lambda修改实例组中实例数量,调整EMR集群计算资源。
首先创建Lambda程序所需的IAM Role,创建步骤如下:
1. 打开 Amazon IAM控制台:
2. 在导航窗格上选择Roles
3. 选择Create role
4. Trusted entity type选择Amazon Web Services service
5. Common use cases选择Lambda,点击下一步
6. 选择Create policy
7. 请确认创建的policy 包含ModifyInstanceGroups权限,权限配置可参考:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "elasticmapreduce:ModifyInstanceGroups",
"Resource": "*"
}
]
}
8. 在新IAM Role中选择新创建的policy,完成IAM Role创建。
其次创建Lambda并部署程序代码
1. 打开 Amazon Lambda控制台:
2. 在导航窗格上选择Functions
3. 选择Create function
4. 选择Author from scratch选项,填写Function name名称
5. Runtime选择python3.9
6. Change default execution role选择Use an existing role并在列表中选择上一步已经创建的IAM Role。
7. 完成Lambda的创建
8. 在新创建的Lambda程序的Code选项中部署如下Python代码:
import boto3
import datetime
# 获取当前时间
today = datetime.datetime.now().strftime("%H:%M:%S")
class Emrclient(object):
def __init__(self):
# 修改emr所在区域
self.region_name = "us-east-1"
self.client = boto3.client("emr", region_name=self.region_name)
# EMR修改实例组的节点数
def modify_instance_groups(self, ClusterId, InstanceGroupId, InstanceCount):
response = self.client.modify_instance_groups(
ClusterId=ClusterId,
InstanceGroups=[
{
'InstanceGroupId': InstanceGroupId,
'InstanceCount': InstanceCount,
},
]
)
return response
def lambda_handler(event, context):
# 实例化
emr = Emrclient()
# 需传入EMR集群ID,实例组ID,自定义节点数量
response = emr.modify_instance_groups('j-xxxxxxx', 'ig-xxxxxxx', 节点数量)
再次创建Amazon EventBridge规则用于定时触发Lambda程序
1. 打开Amazon EventBridge控制台:
2. 在导航窗格上选择Rules
3. 点击Create rule
4. 输入Name信息,Event bus选择default,Rule type选择Schedule,点击下一步
5. Schedule pattern选择A fine-grained schedule that runs at a specific time, such as 8:00 a.m. PST on the first Monday of every month.
6. Cron expression中配置定时任务数据,根据实际需求进行配置,配置需注意时区信息,Cron expression配置完成后会看到Next 10 trigger date(s),然后点击下一步。
Cron expression的配置可参考:
https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/ScheduledEvents.html
7. 在Target types选项勾选Amazon Web Service,在Select a target下拉菜单中选择Lambda function,在Function中勾选上一步创建的Lambda程序,点击下一步。
8. 在Tags中填写标签,点击下一步。
9. 点击Create rule完成规则创建
2. 定时修改实例队列
通过定时执行Lambda修改实例队列中实例数量,调整EMR集群计算资源。
首先创建Lambda程序所需的IAM Role,创建步骤如下:
1. 打开 Amazon IAM控制台:
2. 在导航窗格上选择Roles
3. 选择Create role
4. Trusted entity type选择Amazon Web Services service
5. Common use cases选择Lambda,点击下一步
6. 选择Create policy
7. 请确认创建的policy 包含ModifyInstanceFleet权限,权限配置可参考:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "elasticmapreduce:ModifyInstanceFleet",
"Resource": "*"
}
]
}
8. 在新IAM Role中选择新创建的policy,完成IAM Role创建。
然后创建Lambda并部署程序代码
1. 打开 Amazon Lambda控制台:
2. 在导航窗格上选择Functions
3. 选择Create function
4. 选择Author from scratch选项,填写Function name名称
5. Runtime选择python3.9
6. Change default execution role选择Use an existing role并在列表中选择上一步已经创建的IAM Role。
7. 完成Lambda的创建
8. 在新创建的Lambda程序的Code选项中部署如下Python代码:
import boto3
class Emrclient(object):
def __init__(self):
# 修改emr所在区域
self.region_name = "us-east-1"
self.client = boto3.client("emr", region_name=self.region_name)
# EMR创建或更新托管扩展策略(若仅改动Minimum,后三个参数可直接在类中写死)
# UniType指定修改集群类型(Instances:实例,InstanceFleetUnits:实例队列)
def put_managed_scaling_policy(self,ClusterId,UnitType,Minimum,Maximum,MaximumCapacityUnits,MaximumCoreCapacityUnits):
response = self.client.put_managed_scaling_policy(
ClusterId = ClusterId,
ManagedScalingPolicy={
'ComputeLimits': {
'UnitType': UnitType,
'MinimumCapacityUnits': Minimum,
'MaximumCapacityUnits': Maximum,
'MaximumOnDemandCapacityUnits': MaximumCapacityUnits,
'MaximumCoreCapacityUnits': MaximumCoreCapacityUnits
}
}
)
return response
def lambda_handler(event, context):
emr = Emrclient()
# 需传入EMR集群ID,UniType(集群类型InstanceFleetUnits:实例队列),Minimum,Maximum,MaximumOnDemand,MaximumCore(若仅改动Minimum,后三个参数可直接在类中写死)
response = emr.put_managed_scaling_policy('j-xxxxxxx','InstanceFleetUnits',400,2000,160,160)
注:本文中实例队列的数量配置为每个实例占用的容量单位数。本文使用的值是所选实例类型中的虚拟核心数。
再次创建Amazon EventBridge规则用于定时触发Lambda程序
10. 打开Amazon EventBridge控制台:
11. 在导航窗格上选择Rules
12. 点击Create rule
13. 输入Name信息,Event bus选择default,Rule type选择Schedule,点击下一步
14. Schedule pattern选择A fine-grained schedule that runs at a specific time, such as 8:00 a.m. PST on the first Monday of every month.
15. Cron expression中配置定时任务数据,根据实际需求进行配置,配置需注意时区信息,Cron expression配置完成后会看到Next 10 trigger date(s),然后点击下一步。
Cron expression的配置可参考:
https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/ScheduledEvents.html
16. 在Target types选项勾选Amazon Web Service,在Select a target下拉菜单中选择Lambda function,在Function中勾选上一步创建的Lambda程序,点击下一步。
17. 在Tags中填写标签,点击下一步。
18. 点击Create rule完成规则创建
3. 定时修改EMR-managed scaling
通过定时执行Lambda修改实例队列中实例数量,调整EMR集群计算资源。
首先创建Lambda程序所需的IAM Role,创建步骤如下:
1. 打开 Amazon IAM控制台:
2. 在导航窗格上选择Roles
3. 选择Create role
4. Trusted entity type选择Amazon Web Services service
5. Common use cases选择Lambda,点击下一步
6. 选择Create policy
7. 请确认创建的policy 包含PutAutoScalingPolicy权限,权限配置可参考:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "elasticmapreduce:PutAutoScalingPolicy ",
"Resource": "*"
}
]
}
8. 在新IAM Role中选择新创建的policy,完成IAM Role创建。
然后创建Lambda并部署程序代码
1. 打开 Amazon Lambda控制台:
2. 在导航窗格上选择Functions
3. 选择Create function
4. 选择Author from scratch选项,填写Function name名称
5. Runtime选择python3.9
6. Change default execution role选择Use an existing role并在列表中选择上一步已经创建的IAM Role。
7. 完成Lambda的创建
8. 在新创建的Lambda程序的Code选项中部署如下Python代码:
import boto3
class Emrclient(object):
def __init__(self):
# 修改emr所在区域
self.region_name = "cn-northwest-1"
self.client = boto3.client("emr", region_name=self.region_name)
def put_managed_scaling_policy(self,ClusterId,UnitType,Minimum,Maximum,MaximumCapacityUnits,MaximumCoreCapacityUnits):
response = self.client.put_managed_scaling_policy(
ClusterId = ClusterId,
ManagedScalingPolicy={
'ComputeLimits': {
'UnitType': UnitType,
'MinimumCapacityUnits': Minimum,
'MaximumCapacityUnits': Maximum,
'MaximumOnDemandCapacityUnits': MaximumCapacityUnits,
'MaximumCoreCapacityUnits': MaximumCoreCapacityUnits
}
}
)
return response
def lambda_handler(event, context):
emr = Emrclient()
response = emr.put_managed_scaling_policy('j-xxxxxx','Instances',20,40,40,20)
再次创建Amazon EventBridge规则用于定时触发Lambda程序
1. 打开Amazon EventBridge控制台:
2. 在导航窗格上选择Rules
3. 点击Create rule
4. 输入Name信息,Event bus选择default,Rule type选择Schedule,点击下一步
5. Schedule pattern选择A fine-grained schedule that runs at a specific time, such as 8:00 a.m. PST on the first Monday of every month.
6. Cron expression中配置定时任务数据,根据实际需求进行配置,配置需注意时区信息,Cron expression配置完成后会看到Next 10 trigger date(s),然后点击下一步。
Cron expression的配置可参考:
https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/ScheduledEvents.html
7. 在Target types选项勾选Amazon Web Service,在Select a target下拉菜单中选择Lambda function,在Function中勾选上一步创建的Lambda程序,点击下一步。
8. 在Tags中填写标签,点击下一步。
9. 点击Create rule完成规则创建
标签:self,AWS,选择,Amazon,实例,EMR,Lambda From: https://blog.51cto.com/miracle/6054588