写点什么

使用高级 Amazon CloudWatch 指标和 AWS Lambda 通过空闲检查和自动资源终止优化 Amazon EMR 成本

  • 2019-09-25
  • 本文字数:5899 字

    阅读完需:约 19 分钟

使用高级 Amazon CloudWatch 指标和 AWS Lambda 通过空闲检查和自动资源终止优化 Amazon EMR 成本

许多客户在开发环境中使用 Amazon EMR 运行大数据工作负载,例如 Apache Spark 和 Apache Hive 查询。数据分析师和数据科学家经常使用这些类型的集群,并将它们称为分析 EMR 集群。用户常常会忘记在完成工作后终止这些集群。这将导致集群空闲运行,进而增加不必要的成本。


为避免产生此开销,您必须跟踪 EMR 集群的空闲状态,并在发现有长时间处于空闲状态的集群时将其终止。Amazon EMR 有一个原生 IsIdle Amazon CloudWatch 指标,可通过检查有无 YARN 作业运行来确定集群的空闲状态。但是,您也应该考虑结合使用多种指标(例如连接的 SSH 用户数或正在运行的 Presto 作业数)来确定集群的空闲状态。此外,当您在 Apache Zeppelin 中执行任何 Spark 作业时,IsIdle 指标将长时间保持活动状态 (1),甚至在作业执行完成之后也是如此。在这种情况下,IsIdle 指标在确定集群的非活动状态方面效果并不理想。在这篇博文中,我们将提出一种解决方案来减少这方面的成本。我们实施了一个 bash 脚本,将其安装在 EMR 集群的主节点上,并将该脚本计划为每 5 分钟运行一次。该脚本可监控集群并每 5 分钟向 CloudWatch 发送一次自定义指标 EMR-INUSE(0=非活动;1=活动)。如果 CloudWatch 在一些预定义数据点收到 0(非活动),则将触发警报,然后执行终止集群的 AWS Lambda 函数。

先决条件

在创建和部署此框架之前,您必须满足以下先决条件:


  • AWS 账户

  • Amazon EC2 密钥对

  • 有权创建 AWS 资源的 IAM 用户

  • 正在运行的 Amazon EMR 集群

  • 注意:根据设计,我们将此解决方案作为一项附加功能。我们可以通过将脚本作为 EMR 步骤运行的方式(本文稍后有所介绍),从而将此解决方案应用于任何现有 EMR 集群。如果您在实施此解决方案时希望将其作为将来集群的必备功,则可以将 EMR 步骤作为集群部署的一部分包含在内。此外,还可以将此解决方案应用于通过 AWS CloudFormation、AWS CLI 以及甚至 AWS 管理控制台建立的 EMR 集群。

关键组件

以下是此解决方案的关键组件。

分析 EMR 集群

Amazon EMR 提供了一个托管 Apache Hadoop 框架,可帮助您跨可动态扩展的 Amazon EC2 实例轻松处理大量数据。数据科学家使用分析 EMR 集群进行数据分析,通过笔记本应用程序(如 Apache Zeppelin 或 JupyterHub)进行机器学习,并基于 Apache Spark、Presto 等运行大数据工作负载。

计划程序脚本

schedule_script.sh 是作为 Amazon EMR 步骤执行的 shell 脚本。该脚本执行时,会从 Amazon S3 文件夹复制监控脚本,并将监控脚本的执行频率安排为每 5 分钟运行一次。我们应通过参数传递监控脚本的 S3 位置。


监控脚本

pushShutDownMetrin.sh 脚本是使用 shell 命令实施的监控脚本。它应作为 Amazon EMR 步骤安装在 EMR 集群的主节点中。该脚本的执行频率安排为每 5 分钟运行一次,并且该脚本会将集群活动状态发送给 CloudWatch。

JupyterHub API 令牌脚本

jupyterhub_addAdminToken.sh 脚本是一个 shell 脚本,在集群上启用 JupyterHub 时,该脚本将作为 Amazon EMR 步骤执行。在我们的设计中,监控脚本使用 JupyterHub 提供的 REST API 检查应用程序是否正在使用。


要将请求发送到 JupyterHub,必须同时传递 API 令牌。默认情况下,应用程序不生成 API 令牌。此脚本生成 API 令牌并将其分配给管理员用户,然后监控脚本中的 jupyterhub 模块将选取该令牌,以跟踪应用程序的活动。

自定义 CloudWatch 指标

所有 Amazon EMR 集群都会将多个指标的数据发送到 CloudWatch。指标每 5 分钟更新一次,自动收集数据并推送到 CloudWatch。对于本使用案例,我们创建了 Amazon EMR 指标 EMR-INUSE。此指标表示根据监控脚本中实施的模块检查,确定集群的活动状态。当集群处于非活动状态时,该指标设置为 0,当集群处于活动状态时,该指标设置为 1。

Amazon CloudWatch

CloudWatch 是一种监控服务,可用于设置高精度警报以便自动采取措施。在本例中,如果 CloudWatch 在配置的时长内连续收到 0,则会触发警报。

AWS Lambda

Lambda 是一种无服务器技术,通过该技术,运行代码时无需预配置或管理服务器。借助 Lambda,您可以为几乎任何类型的应用程序或后端服务运行代码,而且全部无需管理。您可以将代码设置为自动从其他 AWS 服务触发。在本例中,触发的 CloudWatch 警报提到了前面提到的要求 Lambda 终止集群的信号。

架构图

下图展示了启用此解决方案时的事件顺序,我们可以看到通过 AWS CloudFormation 建立 EMR 集群的情况。



该图展示了以下步骤:


  1. 启动 AWS CloudFormation 堆栈以建立 EMR 集群。

  2. 2.执行 Amazon EMR 步骤(安装 pushShutDownMetric.sh,然后将其作为 cron 作业计划为每 5 分钟运行一次)。

  3. 3.如果 EMR 集群处于活动状态(执行作业),则主节点将 EMR-INUSE 指标设置为 1 并将其发送到 CloudWatch。

  4. 如果 EMR 集群处于非活动状态,则主节点将 EMR-INUSE 指标设置为 0 并将其发送到 CloudWatch。

  5. 当在一定数量的预定义数据点内收到 0 后,CloudWatch 将触发 CloudWatch 警报。

  6. CloudWatch 警报会向 AWS Lambda 发送通知以终止集群。

  7. AWS Lambda 执行 Lambda 函数。

  8. 然后,Lambda 函数会删除与集群关联的所有堆栈资源。

  9. 最后,EMR 集群终止,并从 AWS CloudFormation 中删除堆栈 ID。

监控脚本中的模块

以下是在监控脚本 (pushShutDownMetric.sh) 中实施的各种活动检查。该脚本采用模块化设计,因此您可以轻松地添加新模块,而无需修改核心功能。

ActiveSSHCheck

ActiveSSHCheck 模块负责检查是否存在与主节点的活动 SSH 连接。如果存在活动 SSH 连接,并且空闲时间少于 10 分钟,该函数会将 EMR-INUSE 指标设置为 1,并将其推送到 CloudWatch。

YARNCheck

Apache Hadoop YARN 是 EMR Hadoop 生态系统的资源管理器。所有的 Spark 提交和 Hive 查询都先到达 YARN。然后,它对这些作业制定计划和进行处理。YARNCheck 模块负责检查 YARN 中是否有正在运行的作业,或者过去 5 分钟内是否有作业已完成。如果找到作业,该函数会将 EMR-INUSE 指标设置为 1,并将其推送到 CloudWatch。检查通过调用 YARN 公开的 REST API 执行。


用于获取正在运行的作业的 API 为 http://localhost:8088/ws/v1/cluster/apps?state=RUNNING。


用于获取已完成作业的 API 为


http://localhost:8088/ws/v1/cluster/apps?state=FINISHED。

PRESTOCheck

Presto 是一个用于运行交互式分析查询的开源分布式查询引擎。它包含在 EMR 版本 5.0.0 及更高版本中。PRESTOCheck 模块负责检查是否有正在运行的 Presto 查询,或者过去 5 分钟内是否有任何查询已完成。如果有,该函数会将 EMR-INUSE 指标设置为 1,并将其推送到 CloudWatch。这些检查通过调用 Presto 服务器公开的 REST API 执行。


用于获取 Presto 作业的 API 为 http://localhost:8889/v1/query。

ZeppelinCheck

Amazon EMR 用户使用 Apache Zeppelin 作为交互式数据探索的笔记本。ZeppelinCheck 模块负责检查是否有正在运行的作业,或者在过去 5 分钟内是否有作业已完成。如果有,该函数会将 EMR-INUSE 指标设置为 1,并将其推送到 CloudWatch。这些检查通过调用 Zeppelin 公开的 REST API 执行。


用于获取笔记本 ID 列表的 API 为 http://localhost:8890/api/notebook。


用于获取每个笔记本 ID 内每个单元状态的 API 为 http://localhost:8890/api/notebook/job/$notebookID。

JupyterHubCheck

Jupyter Notebook 是一个开源 Web 应用程序,可用于创建和共享包含实时代码、方程式、可视化和叙述性文本的文档。JupyterHub 支持托管单用户 Jupyter 笔记本服务器的多个实例。JupyterHubCheck 模块负责检查当前是否在使用 Jupyter 笔记本。


该函数使用 JupyterHub 公开的 REST API 获取 Jupyter 笔记本用户列表,并收集有关各个笔记本服务器的数据。它从响应中提取服务器的最后活动时间,并检查在过去 5 分钟内是否使用了任何服务器。如果有,该函数会将 EMR-INUSE 指标设置为 1,并将其推送到 CloudWatch。jupyterhub_addAdminToken.sh 脚本需要在启用计划程序脚本之前作为 EMR 步骤执行。


用于获取笔记本用户列表的 API 为 https://localhost:9443/hub/api/users -H “Authorization: token $admin_token”。


用于获取各个笔记本信息的 API 为 https://localhost:9443/hub/api/users/$user -H "Authorization: token $admin_token。


如果其中任何一项检查失败,则认为集群处于非活动状态,监控脚本会将 EMR-INUSE 指标设置为 0 并将其推送到 CloudWatch。


注意:


计划程序脚本将监控脚本 (pushShutDownMetric.sh) 计划为每 5 分钟运行一次。在校准 EMR-INUSE 指标时,不考虑运行几分钟的内部 cron 作业。

部署每个组件

请按照本节中的步骤部署前面设计的每个组件。

步骤 1.创建 Lambda 函数和 SNS 订阅

Lambda 函数和 SNS 订阅是设计的核心组件。您必须先设置这些组件,因为每个集群都需要访问他们。以下是需要为这些组件创建的 AWS 资源:


  • Lambda 函数的执行角色

  • 终止空闲 EMR 的 Lambda 函数

  • SNS 主题和 Lambda 订阅

  • 为实现一步式部署,请使用此 AWS CloudFormation 模板一次性启动和配置资源。


该模板提供以下参数。


使用高级 Amazon CloudWatch 指标和 AWS Lambda


要执行手动部署,请在 AWS 管理控制台上执行以下步骤。

Lambda 函数的执行角色
  1. 打开 AWS Identity and Access Management (IAM) 控制台,然后选择策略、创建策略。

  2. 选择 JSON 选项卡,粘贴以下策略文本,然后选择查看策略。


{"Version": "2012-10-17","Statement": [{"Action": ["s3:ListAllMyBuckets","s3:HeadBucket","s3:ListObjects","s3:GetObject","cloudformation:ListStacks","cloudformation:DeleteStack","cloudformation:DescribeStacks","cloudformation:ListStackResources","elasticmapreduce:TerminateJobFlows"],"Resource": "*","Effect": "Allow","Sid": "GenericAccess"},{"Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource": "arn:aws:logs:*:*:*","Effect": "Allow","Sid": "LogAccess"}]}
复制代码


  1. 对于名称,输入 TerminateEMRPolicy,然后选择创建策略。

  2. 选择角色、创建角色。

  3. 5.在选择将使用此角色的服务下,选择 Lambda,然后选择下一步: 权限。

  4. 对于附加权限策略,选择筛选策略旁边的箭头,然后在下拉列表中选择客户管理的策略。

  5. 附加刚刚创建的 TerminateEMRPolicy 策略,然后选择检查。

  6. 对于角色名称,输入 TerminateEMRLambdaRole,然后选择创建角色。

终止空闲 EMR – Lambda 函数

我创建了一个部署软件包以与此函数搭配使用。


  1. 打开 Lambda 控制台,然后选择创建函数。

  2. 选择从头开始创作,然后提供如以下屏幕截图所示的详细信息:


  • 名称:lambdaTerminateEMR

  • 运行时:Python 2.7

  • 角色:选择现有角色

  • 现有角色:TerminateEMRLambdaRole



3. 选择创建函数。


4. 在函数代码部分中,对于代码输入种类,选择从 Amazon S3 上传文件,对于运行时,选择 Python 2.7。


Lambda 函数 S3 链接 URL 为


s3://emr-shutdown-blogartifacts/EMRTerminate.zip。


函数链接:https://s3.amazonaws.com/emr-shutdown-blogartifacts/EMRTerminate.zip


此 Lambda 函数将由 CloudWatch 警报触发。它会解析输入事件,检索 JobFlowId,并删除相应的 JobFlowId 的 AWS CloudFormation 堆栈。

SNS 主题和 Lambda 订阅

要在后续阶段设置 CloudWatch 警报,您必须创建一个 Amazon SNS 主题,以便通知前面的 Lambda 函数执行。请执行以下步骤,创建 SNS 主题并配置 Lambda 终端节点。


  1. 导航到 Amazon SNS 控制台,然后选择创建主题。

  2. 输入主题名称和显示名称,然后选择创建主题。



3. 此主题将创建并显示在主题中


4. 选择该主题,然后选择操作、订阅主题。



5. 在创建订阅中,选择 AWS Lambda,并选择 lambdaterminateEMR 作为终端节点,然后选择创建订阅。

步骤 2.作为 EMR 步骤执行 JupyterHub API 令牌脚本

仅当在集群中启用了 JupyterHub 时,才需要执行此步骤。


导航到要监控的 EMR 集群,然后作为 EMR 步骤执行计划程序脚本。


命令:s3://emr-shutdown-blogartifacts/jupyterhub_addAdminToken.sh



此脚本将生成 API 令牌并将其分配给管理员用户。然后,监控脚本中的 jupyterhub 模块选取该令牌,以跟踪应用程序的活动。

步骤 3.作为 EMR 步骤执行计划程序脚本

导航到要监控的 EMR 集群,然后作为 EMR 步骤执行计划程序脚本。


注意:


确保在集群中禁用终止保护。终止保护标志会导致 Lambda 函数失败。


命令:s3://emr-shutdown-blogartifacts/schedule_script.sh


参数:s3://emr-shutdown-blogartifacts/pushShutDownMetrin.sh



此步骤函数会将 pushShutDownMetric.sh 脚本复制到主节点并将其计划为每 5 分钟运行一次。


schedule_script.sh 位于 https://s3.amazonaws.com/emr-shutdown-blogartifacts/schedule_script.sh。


pushShutDownMetrin.sh 位于 https://s3.amazonaws.com/emr-shutdown-blogartifacts/pushShutDownMetrin.sh。

步骤 4.创建 CloudWatch 警报

为实现一步式部署,请使用此 AWS CloudFormation 模板一次性启动和配置资源。


该模板提供以下参数。


参数默认值描述
s3Bucketemr-shutdown-blogartifacts包含 Lambda 文件的 S3 存储桶的名称
s3KeyEMRTerminate.zipLambda 文件的 Amazon S3 键


AWS CloudFormation CLI 命令如下所示:


aws cloudformation create-stack --stack-name EMRAlarmStack \ --template-body s3://emr-shutdown-blogartifacts/Cloudformation/alarm.json \ --parameters AlarmName=TerminateIDLE-EMRAlarm,EMRJobFlowID=<Input>, EvaluationPeriod=4,SNSSubscribeTopic=<Input>
复制代码


要进行手动部署,请执行以下步骤,创建警报。


  1. 打开 Amazon CloudWatch 控制台,然后选择警报。

  2. 选择创建警报。

  3. 在选择指标页面上的自定义指标下,选择 EMRShutdown/Cluster-Metric。

  4. 选择 EMR JobFlowId 的 isEMRUsed 指标,然后选择下一步。

  5. 根据需要定义警报。在本例中,将警报设置为:当 CloudWatch 在过去 2 小时内每个数据点都收到 IsEMRUsed 指标为 0 时,向 SNS 主题 shutDownEMRTest 发送通知。

  6. 选择创建警报。

小结

在本文中,我们重点构建了一个框架,以减少由于 EMR 集群空闲运行可能产生的额外成本。在 shell 脚本中实施模块、跟踪 Spark 脚本的执行状态以及 Hive/Presto 查询使用轻量级 REST API 调用,这些促使此方法成为一种高效的解决方案。


如果您有任何问题或建议,请在下方留言。


作者介绍:


Praveen Krishnamoorthy Ravikumar 是 Amazon Web Services 的一名助理大数据顾问。


本文转载自 AWS 博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/optimize-amazon-emr-costs-with-idle-checks-and-automatic-resource-termination-using-advanced-amazon-cloudwatch-metrics-and-aws-lambd/


2019-09-25 18:331075
用户头像

发布了 1843 篇内容, 共 110.3 次阅读, 收获喜欢 77 次。

关注

评论

发布
暂无评论
发现更多内容

【安全运维】免费运维软件有哪些?哪款好用一点?

行云管家

运维 安全运维 免费 小微企业

华为云加速器首期加速营圆满结营,40+位创业者携手出海

科技热闻

进阶面试皆宜!阿里强推Java程序员进阶笔记,差距不止一点点

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

3F聆听

郭明

系统梳理面试6大专题,阿里爆款Java面试速成笔记也太香了

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

最全iOS 上架指南

雪奈椰子

面试官:Spring Boot 的启动流程你了解吗?我:。。

Java你猿哥

Java spring Spring Boot ssm main

共享电单车生产厂家排名!怎么选?

共享电单车厂家

共享电动车厂家 共享电单车生产 本铯共享电动车 共享电单车厂家排名

NFTScan:05.15~05.21 NFT 市场热点汇总

NFT Research

Wallys miniPCIe wlan modules/ QCA9880 /2.4G&5G

Cindy-wallys

QCA9880

刷爆LeetCode!字节技术官亲码算法面试进阶神技太香了

做梦都在改BUG

Java 数据结构 算法 LeetCode

【活动预告】数据集成引擎BitSail遇上CDC

字节跳动数据平台

数据集成平台 bitsail

系统梳理面试6大专题,阿里爆款Java面试速成笔记也太香了

Java你猿哥

Java MySQL redis MQ java面试

GitHub标星30k!基于Spring MVC Mybatis分布式开发系统-zheng项目(内附源码)

Java你猿哥

开源 架构设计 分布式架构 JavaEE zheng

阿里开源SpringBoot全栈小册!Github已标星百万

做梦都在改BUG

Java spring Spring Boot 框架

云从科技进入百模大战,行业大模型成为胜负手

ToB行业头条

DAPP合约拆分公排模式项目系统开发技术讲解

I8O28578624

真香!阿里最新产出分布式进阶实战手册,涵盖分布式架构所有操作

Java你猿哥

架构 微服务架构 Spring Cloud Spring Boot ssm

2023年企业降低云支出的小方法汇总

行云管家

云计算 云资源 云成本 云支出

优秀!阿里甩出GC面试小册,仅7天Github获赞96.9K

做梦都在改BUG

Java JVM 垃圾回收 GC

区块链DAPP互助逻辑模式系统开发技术方案

I8O28578624

SpringBoot限制接口访问频率 - 这些错误千万不能犯

做梦都在改BUG

Java spring Spring Boot 框架

阿里、字节等大佬神创,必须是全网最全的Netty核心原理手册

Java你猿哥

Java 源码 Netty ssm netty内存管理

深化企业数据智能应用 用友敢当“急先锋”

用友BIP

2023用友BIP技术大会

直击面试!阿里技术官手码12W字面试小册在Github上爆火

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

在行 | 唱响钢铁冶金行业绿色发展进行曲

用友BIP

理论+实操,带你了解多沙箱容器运行时Kuasar

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

IPQ8072 or IPQ8072A with the QCN9074/9024 chipset / well-suited for high-end routers.

Cindy-wallys

IPQ8072

学会这招,来给你的 SpringBoot 工程部署的 jar 包瘦瘦身吧!

Java你猿哥

Java jar Spring Boot ssm

JVM调优实战:优化Java应用程序的性能

做梦都在改BUG

Java JVM 性能调优

【全网首发】华秋CAM:免费Gerber查看器,离线版!

华秋电子

使用高级 Amazon CloudWatch 指标和 AWS Lambda 通过空闲检查和自动资源终止优化 Amazon EMR 成本_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章