随着客户的业务发展,终端用户的数据量以及大数据分析的需求也随之增加。此时,大数据分析的成本也随之上升。亚马逊云科技提供多种工具协助客户做成本优化,其中使用 **EMR on EC2 Spot Instances** 是常用且有效的方式,节省可高达90% 。
EMR on EC2 Spot Instances:
https\://aws.amazon.com/cn/ec2/spot/use-case/emr/
[Amazon EMR](https://aws.amazon.com/cn/emr/?trk=cndc-detail) 实例组支持实例组(Instance Group)及实例集(Instance Fleets)两种配置,对比可参考以下表格:
![image.png](https://dev-media.amazoncloud.cn/43d4c420f86e4c7a866df4779291b3ae_image.png "image.png")
实例集的分配策略:
https\://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-instance-fleet.html#emr-instance-fleet-allocation-strategy
更多内容可参考集群**配置指南及最佳实践**。
配置指南及最佳实践:
https\://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-instances-guidelines.html
Instance Fleets 相比于Instance Group,不需要为 [Amazon EMR](https://aws.amazon.com/cn/emr/?trk=cndc-detail) 集群指定 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)可用区,并为 [Amazon EMR](https://aws.amazon.com/cn/emr/?trk=cndc-detail) 实例组指定 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例类型,只需要提供可用区和实例的列表,[Amazon EMR](https://aws.amazon.com/cn/emr/?trk=cndc-detail) 就会根据费用和可用性自动选择最优组合。客户在 EMR Instance Group 转为使用 Instance Fleets 后,大大增加了 Spot的 灵活度和成本优化。然而,Instance Fleets 当前只支持托管伸缩规则,暂未支持如 Instance Group 的**自定义伸缩规则**。当客户使用 **EMR 托管扩展**时,集群的扩展**决策指标**较多且无法基于业务特性自定义。
自定义伸缩规则:
https\://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-automatic-scaling.html
EMR 托管扩展:
https\://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-managed-scaling.html
决策指标:
https\://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/managed-scaling-metrics.html
对于客户有大量 EMR 集群,基于业务特性不同时伸缩阈值不同。尤其对于集群任务存在骤升骤降,且业务特征规律重复明显的情况,客户希望可自定义伸缩规则实现最大化的成本优化。
以下方案是 EMR Instance Fleets 通过 EventBridge、Lambda、DynamoDB 和 CloudWatch 实现 EMR Instance Fleets 自定义弹性伸缩。
## **1、服务介绍**
### **Amazon EventBridge**
[Amazon EventBridge](https://aws.amazon.com/cn/eventbridge/?trk=cndc-detail) 是一种[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)事件总线,可使用从您的应用程序、集成式软件即服务(SaaS)应用程序和 Amazon 服务生成的事件,更轻松地大规模构建事件驱动型应用程序。EventBridge 提供从事件源到目标对象的实时数据流。借助 EventBridge,可实现 Amazon Services 之间基于规则的实时驱动,同时也支持定时任务式的交互驱动。
![image.png](https://dev-media.amazoncloud.cn/79079a3e6aee4874ba6364a0c939c5eb_image.png "image.png")
### **Amazon Lambda**
Amazon Lambda 是一项高可用的 ServerLess 计算服务,可使用户无需预配置或管理服务器即可运行代码。用户可以运行 Lambda 以响应事件,在使用时只需负责自己写的代码(支持如 Node.js、Python、Java 等7种编程语言),通过代码来实现业务逻辑。基于 Lambda 用户可以实现在云上轻松实现服务间的自动化调用,提升云上服务效率。
### **Amazon DynamoDB**
[Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 是一种完全托管式、[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)的 NoSQL 键值数据库,旨在运行任何规模的高性能应用程序。用户可以利用 DynamoDB 作为轻量化的键值数据库,用于存放自动化方案中需要引用的参数。同时,DynamoDB 与 Amazon 云上服务有多个灵活接口及 SDK,易于服务间交互。
### **Amazon CloudWatch**
[Amazon CloudWatch](https://aws.amazon.com/cn/cloudwatch/?trk=cndc-detail) 是一种专门为 DevOps 工程师、开发人员、站点可靠性工程师(SRE)、IT 经理和产品拥有者设计的监控和可观测性服务。CloudWatch 为您提供相关数据和切实洞察,以监控应用程序、响应系统范围的性能变化并优化资源利用率。CloudWatch 以日志、指标和事件的形式收集监控和运营数据。您可以统一查看运行状况,获得在 Amazon 和本地运行的 Amazon 资源、应用程序和服务的完全可见性。
## **2、方案架构**
![image.png](https://dev-media.amazoncloud.cn/4caa664a78884f989df6dd6bc47ef712_image.png "image.png")
基于客户的需求,此方案架构可以基于客户自定义间隔定期触发 EventBridge 规则,读取 DynamoDB 中需要进行弹性伸缩集群的名称及参数,且比对 CloudWatch 中 EMR 集群的 YARNMemoryAvailablePercentage ,用于伸缩 TASK 节点组;比对 CloudWatch 中 EMR 集群的 HDFSUtilization,用于伸缩 CORE 节点组,同时伸缩前检查 DynamoDB 中 EMR 集群上次伸缩的时间,冷却时间内不进行伸缩,最后基于自定义阈值进行弹性伸缩。
通过此方案,客户针对 EMR Instance Fleets 集群基于自定义阈值进行弹性伸缩,可最大化的优化成本及精细化管理。
## **3、方案配置**
### **创建 Dynamodb**
1、创建 emr_scaling 表,输入以下信息,点击 Create:
![image.png](https://dev-media.amazoncloud.cn/bf7c5f174bce4d1194b95babce01dfdb_image.png "image.png")
根据以下定义,创建对应的 Item:
![image.png](https://dev-media.amazoncloud.cn/ea4d9ff13244417b8fc6b3b11c59723d_image.png "image.png")
2、创建 emr-instancefleet-scaling 表,输入以下信息,点击 Create:
![image.png](https://dev-media.amazoncloud.cn/762e7dbac6d7410b91559cafdee32f35_image.png "image.png")
### **创建 Lambda**
1、配置 instancefleeting_auto_scaling 函数
![image.png](https://dev-media.amazoncloud.cn/8bd34a019a654051885ee76ac695ba4d_image.png "image.png")
2、导入以下代码:
https\://github.com/christofile/aws-emr-instancefleet-custom-scaling/blob/main/aws_emr_instancefleet_custom_scaling.py
3、配置 Lambda 函数 Permission 具有以下权限
![image.png](https://dev-media.amazoncloud.cn/29952be9d61a4737934f57cede158f4a_image.png "image.png")
创建并 attach 以下 Policy:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ScalingPolicy",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:<AccountID>:table/emr-instancefleet-scaling",
"arn:aws:dynamodb:us-west-2: :<AccountID>:table/emr_scaling"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"elasticmapreduce:ListInstanceFleets",
"elasticmapreduce:ListClusters",
"cloudwatch:GetMetricStatistics",
"elasticmapreduce:DescribeCluster",
"elasticmapreduce:ModifyInstanceFleet"
],
"Resource": "*"
}
]
}
```
创建 **EventBridge**
4、配置 emr_instancefleet_schedule Rule
a. Event schedule
可根据业务需求定义定时任务的触发时间,建议和 CloudWatch 读取指标间隔(Interval)保持一致。
![image.png](https://dev-media.amazoncloud.cn/474941ee7edc44e4b0cb3b3d65ef9335_image.png "image.png")
b. Targets
Target 关联上面配置的 Lambda。
![image.png](https://dev-media.amazoncloud.cn/57ecfbc2610b4916bd61ce094a239f2b_image.png "image.png")
配置完成后,可在 Lambda 侧看到以下关联关系
![image.png](https://dev-media.amazoncloud.cn/d8ee15aba6b0432bb5f629169bf02e57_image.png "image.png")
## **4、方案测试**
**基于以上方案,配置完成后,按照以下步骤测试:**
1、开启集群的托管伸缩规则
2、调度平台调度27个测试任务
3、记录执行的 Job Flow ID 以及执行时间
4、关闭集群的托管伸缩规则
5、在 DynamoDB emr_scaling 添加需要测试的集群及对应的参数,以下是配置示例:
![image.png](https://dev-media.amazoncloud.cn/6731fe141f454c368ad8bf40ae15f310_image.png "image.png")
6、调度平台调度27个测试任务
7、记录执行的 Job Flow ID 以及执行时间。
**测试结果:**
测试1: 托管策略 执行时间:11min 花费 $26.5
测试2: 自定义策略 执行时间:13min 花费 $8.43
成本节省约68.2%。
## **5、总结**
简而言之,Amazon 平台上服务多样且灵活。用户可以基于生产需求,通过无服务方式来实现自定义配置,精细化管理以及自动化流程。Amazon Lambda 可以通过定制化的方式来满足不同业务场景的需求,也可以和其他相关服务集成进一步提升运维自动化的能力。客户针对 EMR Instance Fleets 集群基于自定义阈值进行弹性伸缩,可最大化的优化成本及精细化管理。
**本篇作者**
![image.png](https://dev-media.amazoncloud.cn/56b87191acc64443b808656be98a7bf1_image.png "image.png")
**梁绮莹**
*亚马逊云科技解决方案架构师,专注于数字原生企业的云架构设计和咨询,负责支持全球头部电商公司云项目。在云网络、应用交付、应用层安全、CDN、容器及微服务等领域有丰富的实战经验。*