留言

将 Amazon EMR 在 EC2 上的费用归因于您的终端用户 大数据博客

将 Amazon EMR 在 EC2 的成本归因于最终用户

关键要点

使用 Amazon EMR 可以简化大数据处理和分析工作,将重点放在洞察数据上,而不仅仅是基础架构。成本优化是 AWS WellArchitected Framework 的重要组成部分,旨在避免不必要的支出。本文分享了一种可以用来跟踪和分配运行在 Amazon EMR 上的 Spark 工作负载成本的计费模型。解决方案利用 AWS 服务和定时 Lambda 函数来捕获和报告 EMR 使用情况。

Amazon EC2 上的 Amazon EMR 是一项托管服务,使得在 AWS 上运行大数据处理和分析工作负载变得简单。它简化了流行开源框架如 Apache Hadoop 和 Apache Spark的设置和管理,帮助您将重点放在从大型数据集中提取洞察上,而不是基础设施的管理上。借助 Amazon EMR,您可以利用这些大数据工具的强大功能,从大量数据中处理、分析并获取有价值的商业智能。

成本优化是 WellArchitected Framework 的支柱之一。它专注于避免不必要的支出、选择最合适的资源类型、分析支出趋势以及根据业务需求进行灵活扩展。优化的工作负载最大限度地利用所有可用资源,以最具成本效益的价格交付预期结果,并满足您的功能需求。

当前的 Amazon EMR 定价页面 展示了集群的预计成本。您还可以使用 AWS Cost Explorer 获取更详细的费用信息。这些视图为您提供了 Amazon EMR 成本的整体图景。然而,您可能需要在单个 Spark 作业级别分配成本。例如,您可能想知道财务业务部门在 Amazon EMR 中的使用费用,或者出于分摊目的,您可能需要按功能区域汇总 Spark 应用程序的成本。在将成本分配到各个 Spark 作业后,这些数据可以帮助您做出明智的决策以优化成本。例如,您可以选择重构应用程序以使用更少的资源,或者选择探索不同的定价模式,如 Amazon EMR on EKS 或 Amazon EMR Serverless。

在本文中,我们分享了一种可以用来追踪和分配在 Amazon EC2 上运行的 Spark 工作负载成本的计费模型。我们描述了一种将 Amazon EMR 成本分配给不同作业、团队或业务线的方法。您可以使用此功能将成本分散到各个业务单位,从而协助您监控基于 Spark 的工作负载的投资回报。

解决方案概述

本解决方案旨在帮助您跟踪在 EMR 上运行的 Spark 应用程序的成本。它可以帮助您识别成本优化点,并提高 EMR 集群的成本效率。

此方案使用一个定时的 AWS Lambda 函数,该函数每天运行一次。该函数捕获使用情况和成本指标,随后将其存储在 Amazon RDS 数据库中。存储在 RDS 表中的数据将被查询,以推导计费数据,并使用 Amazon QuickSight 生成报告趋势。使用这些 AWS 服务会产生额外的费用。如果您希望避免使用额外的 AWS 服务及相关成本,则可以考虑使用 已安装的基于 cron 的代理脚本。该脚本将相关指标存储在 Amazon S3 存储桶中,并使用 Python Jupyter notebooks 根据存储在 Amazon S3 中的数据文件生成计费号码,同时使用 AWS Glue 表。

以下图表展示了当前的解决方案架构。

工作流程包括以下步骤:

获取参数:Lambda 函数从 Parameter Store 中获取参数,该功能是 AWS Systems Manager 的一部分:

将 Amazon EMR 在 EC2 上的费用归因于您的终端用户 大数据博客

json{ yarnurl http//dummycompute1amazonawscom8088/ws/v1/cluster/apps tblapplicationlogslz publicemrapplicationsexecutionloglz tblapplicationlogs publicemrapplicationsexecutionlog tblemrcost publicemrclusterusagecost tblemrinstanceusage publicemrclusterinstancesusage emrclusterid jxxxxxxxxxx emrclustername EMRCostMeasure emrclusterrole dtdnashared emrclusterlinkedaccount xxxxxxxxxxx postgresrds { host xxxxxxxxxamazonawscom dbname postgres user postgresadmin secretid postgressecretid }}

提取应用日志:Lambda 函数使用资源管理API从 EMR 集群中提取 Spark 应用的运行日志。在这个过程中提取以下指标:vcore秒、内存 MB秒和存储 GB秒。

捕获每日成本:Lambda 函数捕获来自 Cost Explorer 的 EMR 集群的每日成本。

提取实例使用数据:Lambda 函数还使用 Amazon Elastic Compute Cloud (Amazon EC2) Boto3 API 提取 EMR 按需和 Spot 实例的使用数据。

加载数据:Lambda 函数将这些数据集加载到 RDS 数据库中。

计算成本:根据 Spark 应用程序使用的 CPU 资源来确定运行成本,与所有 Spark 应用程序的总 CPU 使用情况进行比较。此信息用于在不同团队、业务线或 EMR 队列之间分配整体成本。

提取过程每天运行,提取前一天的数据并存储在 Amazon RDS for PostgreSQL 表中。根据您的使用案例,需要定期清除表中的历史数据。

该解决方案为开源,源代码可在 GitHub 上找到。

您可以使用 AWS Cloud Development Kit (AWS CDK) 部署 Lambda 函数、RDS for PostgreSQL 数据模型表和 QuickSight 仪表板,以跟踪按作业、团队或业务单位划分的 EMR 集群成本。

以下架构展示该解决方案中查询的表格,以填充仪表板。

emrapplicationsexecutionloglz or publicemrapplicationsexecutionlog 存储 EMR 集群上所有作业的每日运行指标:appdatecollect 日志收集日期appid Spark 作业运行 IDappname 运行名称queue 运行作业的 EMR 队列jobstate 作业运行状态jobstatus 作业运行最终状态 (Succeeded 或 Failed)starttime 作业开始时间endtime 作业结束时间runtimeseconds 运行时长秒vcoreseconds 消耗的 vCore CPU秒memoryseconds 消耗的内存runningcontainers 使用的容器

rmclusterid EMR 集群 ID

emrclusterusagecost 捕获来自 Cost Explorer 的 Amazon EMR 和 Amazon EC2 的每日成本消耗,并将数据加载到 RDS 表中:

costdatecollect 成本收集日期startdate 成本开始日期enddate 成本结束日期emruniquetag 与 EMR 集群关联的标签netunblendedcost 总未加权的每日美元成本unblendedcost 总未加权的每日美元成本costtype 每日成本类型servicename 产生成本的 AWS 服务Amazon EMR 和 Amazon EC2emrclusterid EMR 集群 IDemrclustername EMR 集群名称

loadtime 表加载的日期/时间

苹果加速器免费版

emrclusterinstancesusage 捕获每个 EMR 集群节点的聚合资源使用情况vCores和分配资源,以及帮助识别集群的闲置时间:

instancedatecollect 实例使用收集日期emrinstancedayrunseconds EMR 实例在这一天的活跃秒数emrregion EMR 集群的 AWS 区域emrclusterid EMR 集群 IDemrclustername EMR 集群名称emrclusterfleettype EMR 集群队列类型emrnodetype 实例节点类型emrmarket 市场类型按需或预置emrinstancetype 实例大小emrec2instanceid 相应的 EC2 实例 IDemrec2status 运行状态emrec2defaultvcpus 分配的 vCPUemrec2memory EC2 实例内存emrec2creationdatetime EC2 实例创建的日期/时间emrec2enddatetime EC2 实例结束日期/时间emrec2readydatetime EC2 实例准备就绪的日期/时间loadtime 表加载的日期/时间

先决条件

在实施此解决方案之前,您必须具备以下条件:

一个在 EC2 上的 EMR 集群。EMR 集群必须定义唯一的标签值。您可以直接在 Amazon EMR 控制台上分配标签,或使用 Tag Editor。推荐的标签键为 costcenter,并为您的 EMR 集群提供唯一值。在创建并应用用户定义的标签后,标签键可能需要最长 24 小时才会出现在您的费用分配标签页面以供激活。激活标签 在 AWS 账单中。如果在激活前未完成,则需等待约 24 小时才能激活该标签。要激活该标签,请按照以下步骤操作:在 AWS 账单和成本管理控制台中,从导航窗格选择 成本分配标签。选择您想要激活的标签键。选择 激活。Spark 应用程序的名称应遵循标准命名约定,由七个通过下划线分隔的组件组成:ltbusinessunitgtltprogramgtltapplicationgtltsourcegtltjobnamegtltfrequencygtltjobtypegt。这些组件用于在最终报告中汇总资源消耗和成本。例如:HRPAYROLLPSPSPRODTAXDUDUCTIONDLYLD、FINCASHRECEIPTGLGLDBMAINDLYLD 或 MKTCAMPAIGNCRMCRMDBTOPRATEDCAMPAIGNDLYLD。应用名称必须在 spark submit 命令中通过 name 参数以标准命名约定提供。如果其中任何组件没有值,请使用以下建议名称硬编码值:frequencyjobtypeBusinessunitLambda 函数需要能够连接到 Cost Explorer,使用资源管理 API 连接到 EMR 集群,并将数据加载到 RDS for PostgreSQL 数据库中。为此,您需要正确配置 Lambda 函数:VPC 配置 Lambda 函数需要能够访问 EMR 集群、Cost Explorer、AWS Secrets Manager 和 Parameter Store。如果尚未配置访问权限,您可以通过创建包含 EMR 集群的虚拟私有云VPC,并为 Parameter Store 和 Secrets Manager 创建 VPC 端点,并将其附加到 VPC 来实现。由于 Cost Explorer 没有可用的 VPC 端点,为使 Lambda 连接到 Cost Explorer,需要一个私有子网和一个路由表,将 VPC 流量发送到公共 NAT 网关。如果您的 EMR 集群位于公共子网中,您必须创建包含自定义路由表和公共 NAT 网关的私有子网,以允许从 VPC 私有子网流向 Cost Explorer 连接。有关设置说明,请参考 如何为 Amazon VPC 中的私有子网设置 NAT 网关?,并明确将新创建的私有子网附加到 Lambda 函数。IAM 角色 Lambda 函数需要有一个 AWS 身份和访问管理 (IAM) 角色,具有以下权限:AmazonEC2ReadOnlyAccess、AWSCostExplorerFullAccess 和 AmazonRDSDataFullAccess。此角色将在 AWS CDK 堆栈部署期间自动创建;您无需单独设置该角色。应先在 AWS Cloud9首选或其他开发环境如 VSCode 或 Pycharm中安装 AWS CDK。有关更多信息,请参考 先决条件。RDS for PostgreSQL 数据库版本 10 或更高的凭据应存储在 Secrets Manager 中。有关更多信息,请参考 在 AWS Secrets Manager 中存储数据库凭据。

创建 RDS 表格

通过手动登录到 postgres rds 的公共架构,创建在 emrcostrdstablesddlsql 中提到的数据模型表格。

使用 DBeaver 或任何兼容的 SQL 客户端连接到 RDS 实例,验证表格已创建。

部署 AWS CDK 堆栈

按照本节中的步骤使用 AWS CDK 部署以下资源:

Parameter Store 用于存储所需的参数值Lambda 函数的 IAM 角色,用于连接到 Amazon EMR 和底层 EC2 实例、Cost Explorer、CloudWatch 和 Parameter Store

Lambda 函数

克隆 GitHub 仓库:

bashgit clone git@githubcomawssamples/attributeamazonemrcoststoyourendusersgit

更新 cdkcontextjson 中的以下环境参数该文件位于主目录中:

yarnurl YARN ResourceManager URL,用于读取作业运行日志和指标。此 URL 应在 Lambda 部署的 VPC 中可访问。tblapplicationlogslz 用于存储 EMR 应用程序运行日志的 RDS 临时表。tblapplicationlogs 用于存储 EMR 应用程序运行日志的 RDS 表。tblemrcost 用于捕获每日 EMR 集群使用成本的 RDS 表。tblemrinstanceusage 用于存储 EMR 集群实例使用信息的 RDS 表。emrclusterid EMR 集群实例 ID。emrclustername EMR 集群名称。emrclustertag 分配给 EMR 集群的标签键。emrclustertagvalue EMR 集群标签的唯一值。emrclusterrole Amazon EMR 的服务角色EMR 角色。emrclusterlinkedaccount 运行 EMR 集群的帐户 ID。postgresrds RDS for PostgreSQL 的连接信息。vpcid EMR 集群配置的 VPC
如何 BRIA AI 利用 Amazon SageMaker 的分布式训练来训练用于商业用途的潜在扩 探索云财务管理超越成本节约的好处 云财务管理