首页 > 其他分享 > 通过Lambda优化 AWS EMR 成本

通过Lambda优化 AWS EMR 成本

时间:2023-02-13 18:31:52浏览次数:74  
标签:self AWS 选择 Amazon 实例 EMR Lambda

背景

随着AWS EMR服务用户越来越多,持续运行的AWS EMR在成本优化方面会有较多限制,本文会提供一些特定情况下AWS EMR平台成本优化的一些方法和思路。本文主要包含“控制实例组资源”、“控制实例队列资源”、“控制EMR-managed scaling弹性配置”实现成本的优化,实际的使用可以根据EMR集群配置组合使用。

 

成本优化方法

本文方案主要为通过Lambda程序控制EMR集群数量方式节省成本,Lambda可根据计算任务低峰期和高峰期调整EMR集群实例数量,节省EMR实例费用、EBS磁盘费用、EMR服务费用。同时本文也有对EMR-managed scaling的控制,可以搭配使用节省更多成本。

 可采用定时任务方式控制集群资源,该方式适合固定大小的EMR集群在指定时间的扩展和缩减,Lambda程序可以控制添加按需/竞价实例。

 通过Lambda优化 AWS EMR 成本_AWS

可结合EMR-managed scaling功能控制集群资源,该方式适合动态大小的EMR集群在指定时间的增加集群容量上限,Lambda程序可以控制扩展集群添加更多按需/竞价实例。

 

 通过Lambda优化 AWS EMR 成本_python_02

以下项目样例就较为适合使用本文方案进行调整,低峰期使用Lambda程序修改EMR-managed scaling的容量,在凌晨00:30定时扩展集群实例组和EMR-managed scaling配置规模,用于完成夜间计算任务所需资源,在8点完成计算任务后通过Lambda程序修改EMR-managed scaling的容量减少集群2/3资源,由EMR-managed scaling完成集群规模的缩减,可节省平台EMR实例费用、EBS磁盘费用、EMR服务费用。

 通过Lambda优化 AWS EMR 成本_AWS_03

配置方法

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选择defaultRule 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选择defaultRule 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选择defaultRule 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

相关文章