借助 Serverless 服务实现 EMR Instance Fleets 集群自定义弹性伸缩

Serverless
Amazon EMR
0
0
随着客户的业务发展,终端用户的数据量以及大数据分析的需求也随之增加。此时,大数据分析的成本也随之上升。亚马逊云科技提供多种工具协助客户做成本优化,其中使用 **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、容器及微服务等领域有丰富的实战经验。*
0
目录
关闭