撰写者 :Boon Lee Eu、Kyara Labrador、Vikas Omer 和 Lorenzo Ripani
日期 :2024年10月25日
分类 :、、、
在本文中,我们将指导您如何在 AWS 环境中部署一个全面的解决方案,分析 Amazon EMR 在 EC2上的集群使用情况。通过这个解决方案,您将深入了解在 EMR集群上运行的各个应用的资源消耗和相关成本,这将帮助您优化成本、实施公正的计费做法,以便做出更明智的工作负载管理决策,从而提升整体的效率和成本效益。该解决方案仅在运行于 EC2 上的 EMR Spark 负载上进行了测试,并未在其他基于 YARN 的框架负载(如 HIVE 或 TEZ)上进行测试。
该解决方案通过在 EMR 集群的主节点上运行 Python 脚本来收集 YARN 资源管理器的指标,并将其与 AWS 成本和使用报告(AWSCUR)中的成本使用详细信息相关联。该脚本由 cronjob 启动,向 YARN 资源管理器发起 HTTP 请求,以收集来自
/ws/v1/cluster/metrics
的集群指标和 /ws/v1/cluster/apps
的应用指标。集群指标包含集群资源的利用信息,而应用指标则包含特定应用或作业的利用信息。这些指标存储在 Amazon S3 存储桶中。
两个 YARN 指标捕捉应用或作业的资源利用信息:
该解决方案利用 memorySeconds 推导应用或作业的运行成本,如有需要也可调整为使用 vcoreSeconds。
收集到的 YARN 指标的元数据存储于 Amazon S3 中,并在 AWS Glue 数据目录中创建、存储并表示为数据库和表,随后可供 AmazonAthena 进一步处理。您现在可以在 Athena 中撰写 SQL 查询,将 YARN 指标与 AWS CUR中的成本使用信息关联,从而推导出基础设施和应用的 EMR 集群详细成本细分。该解决方案会创建两个相对应的 Athena 视图,用于成本细分,这将成为 Amazon QuickSight 的数据源以便于可视化。
以下图示显示了解决方案架构。
![EMR删除)
要执行该解决方案,您需要满足以下前提条件:
AWS 需要最多 24 小时才能开始将报告传送到您的 S3 存储桶。之后,您的 CUR 至少每天更新一次。
crawler-cfn.yml
,在 CUR 创建期间会自动生成在同一 S3 存储桶中。请遵循中的指示将 Athena 与 CUR 整合。该模板将创建一个指向 CUR 的 AWS Glue 数据库、一个 AWS Lambda 事件,以及一个 AWS Glue 爬虫,当 CUR 更新时,由 S3 事件通知会自动调用该爬虫,更新 AWS Glue 数据库。aws:elasticmapreduce:job-flow-id
,这样能够填充 CUR 中的字段 resource_tags_aws_elasticmapreduce_job_flow_id
,并由解决方案中的 SQL 查询使用。要从管理控制台启用成本分配标签,请按照以下步骤操作:aws:elasticmapreduce:job-flow-id
以下截图显示了激活 aws:elasticmapreduce:job-flow-id
标签的示例。
删除)
现在,您可以在实验环境中测试此解决方案。如果您尚不熟悉 EMR,请遵循中的详细说明以启动新的 EMR 集群并运行示例 Spark 作业。
要部署该解决方案,请按照接下来的步骤进行。
从下载两个脚本,并将它们保存到 S3 存储桶中:
emr_usage_report.py
- 用于向 YARN 资源管理器发送 HTTP 请求的 Python 脚本emr_install_report.sh
- 创建 cronjob 每分钟运行 Python 脚本的 Bash 脚本要安装这些脚本,请通过控制台或AWS 命令行介面 (AWS CLI)
使用 aws emradd-step
命令向 EMR 集群添加步骤。
替换: - REGION
为集群运行的 AWS 区域(例如,欧洲(爱尔兰) eu-west-1
) - MY-BUCKET
为存储脚本的存储桶名称(例如,my.artifact.bucket
) - MY_REPORT_BUCKET
为您希望收集 YARN指标的存储桶名称(例如,my.report.bucket
)
`bash aws emr add-steps \ --cluster-id j-XXXXXXXXXXXXX \ --stepsType=CUSTOM_JAR,Name="Install YARNreporter",Jar=s3://REGION.elasticmapreduce/libs/script-runner/script- runner.jar,Args=上传到 CloudFormation 模板所需的 S3 存储桶,以便在 QuickSight中构建初始分析。准备就绪后,请继续启动堆叠以供应解决方案的其余资源。
这会自动在您的 AWS 帐户中启动 AWS CloudFormation 及其模板。根据需要提示您登录,并确保在您打算的区域内创建堆叠。
CloudFormation 堆叠需要几个参数,如下图所示。
![CloudFormation删除)
以下表格描述了参数。
参数 | 描述 |
---|---|
堆叠名称 | 堆叠的有意义名称,例如 EMRUsageReport |
S3 配置 | |
YARNS3BucketName | YARN 指标存储的 S3 存储桶名称 |
成本使用报告配置 | |
CURDatabaseName | AWS Glue 中的成本使用报告数据库名称 |
CURTableName | AWS Glue 中的成本使用报告表名称 |
AWS Glue 数据库配置 | |
EMRUsageDBName | 为 EMR 成本使用报告创建的 AWS Glue 数据库名称 |
EMRInfraTableName | 为基础设施使用指标创建的 AWS Glue 表名称 |
EMRAppTableName | 为应用使用指标创建的 AWS Glue 表名称 |
QuickSight 配置 | |
QSUserName | QuickSight 中的用户名称,用于管理 EMR 使用报告资源。 |
QSDefinitionsFile | EMR 使用报告的定义 JSON 文件的 S3 URI。 |
CAPABILITY_AUTO_EXPAND
的复选框。堆叠的创建将需几分钟以创建解决方案的其余资源。在 CloudFormation 堆叠创建后,您可以在 输出 标签中找到创建的资源详细信息。
CloudFormation 模板创建了两个 Athena 视图,包含 YARN 集群和应用指标的相关成本细分详情。CUR按小时聚合成本,因此推导出运行应用的成本将根据 EMR 集群的每小时运行成本进行按比例的计算。
以下截图显示了 YARN 集群指标的关联成本细分详情的 Athena 视图。
删除)
以下表格描述了 YARN 集群指标的 Athena 视图中的字段。
字段 | 类型 | 描述 |
---|---|---|
cluster_id | 字符串 | 集群的 ID。 |
family | 字符串 | 集群的资源类型。可能的值有计算实例、弹性 Map Reduce 实例、存储和数据传输。 |
billing_start | 时间戳 | 资源的计费开始小时。 |
usage_type | 字符串 | 资源的具体类型或单位,如 BoxUsage:m5.xlarge 的计算实例。 |
cost | 字符串 | 与资源相关的成本。 |
以下截图显示了 YARN 应用指标的相关成本细分详情的 Athena 视图。
![成本细分 YARN删除)
以下表格描述了 YARN 应用指标的 Athena 视图中的字段。
字段 | 类型 | 描述 |
---|---|---|
cluster_id | 字符串 | 集群的 ID |
id | 字符串 | 应用运行的唯一标识符 |
user | 字符串 | 用户名 |
name | 字符串 | 应用名称 |
queue | 字符串 | YARN 资源管理器中的队列名称 |
finalstatus | 字符串 | 应用的最终状态 |
applicationtype | 字符串 | 应用类型 |
startedtime | 时间戳 | 应用的开始时间 |
finishedtime | 时间戳 | 应用的结束时间 |
elapsed_sec | 双精度 | 运行应用所需的时间 |
memoryseconds | bigint | 分配给应用的内存 (MB) 乘以应用运行的秒数 |
vcoreseconds | int | 分配给应用的 YARN 虚拟核心数乘以应用运行的秒数 |
total_memory_mb_avg | 双精度 | 每小时可用于集群的内存总量 (MB) |
memory_sec_cost | 双精度 | memoryseconds 的推导单位成本 |
application_cost | 双精度 | 基于 memoryseconds 的应用相关推导成本 |
total_cost | 双精度 | 每小时与集群相关的资源总成本 |
在 QuickSight 中,CloudFormation 模板创建了两个引用 Athena视图的数据集作为数据源,还创建了一个样本分析。该样本分析包含两个工作表,分别为 EMR Infra Spend
和 EMR AppSpend
,并预先填充了条形图和数据透
Leave a Reply