监控和优化适用于 Apache Spark 的 亚马逊云科技 Glue 的成本

亚马逊云科技 Glu e 是一项无服务器数据集成服务,可轻松发现、准备和组合用于分析、机器学习 (ML) 和应用程序开发的数据。您可以使用 亚马逊云科技 Glue 创建、运行和监控数据集成和 ETL(提取、转换和加载)管道,并在多个数据存储中对资产进行分类。

我们从客户那里得到的最常见问题之一是如何有效监控和优化 亚马逊云科技 Glue for Spark 的成本。亚马逊云科技 Glue 的功能和定价选项的多样性使您可以灵活地有效管理数据工作负载的成本,同时还能根据业务需求保持性能和容量。尽管 亚马逊云科技 Glue 工作负载的成本优化的基本过程保持不变,但您可以监控任务运行并分析成本和使用情况,以节省开支,并采取措施对代码或配置进行改进。

在这篇文章中,我们演示了一种战术方法,通过在 亚马逊云科技 Glue 工作负载之上进行监控和优化技术,帮助您管理和降低成本。

监控适用于 Apache Spark 的 亚马逊云科技 Glue 的总体成本

适用于 Apache Spark 的 Aws Glue 根据数据处理单元 (DPU) 的数量按小时收费,以 1 秒为增量收费,最少 1 分钟。在 亚马逊云科技 Glue 定价 中了解更多信息 。本节介绍了一种监控适用于 Apache Spark 的 亚马逊云科技 Glue 总体成本的方法。

亚马逊云科技 Cost Explorer

亚马逊云科技 Cost Explorer 中 ,您可以查看 DPU 工时的总体趋势。完成以下步骤:

  1. 在成本管理器控制台上,创建新的成本和使用情况报告。
  2. 对于 “ 服务 ” ,选择 Glu e 。
  3. 对于 使用类型 ,选择以下选项:为标准作业
    1. 选择 -etl-DPU-hour(DPU-hour)
    2. 为 Flex
    3. 作业选择 -etl-Flex-DPU-Hour (DPU- Hour)。
    4. 选择 -glueInteractivesSession-DPU-Hour(DPU-Hour)进行交互 式会话。
  4. 选择 “ 应用 ” 。

Cost Explorer for Glue usage

要了解更多信息,请参阅 使用 亚马逊云科技 Cost Explorer 分析您的成本

监控单个作业运行成本

本节介绍了一种在适用于 Apache Spark 的 亚马逊云科技 Glue 上监控单个任务运行成本的方法。有两种选择可以实现此目的。

亚马逊云科技 Glue Studio 监控页面

在 亚马逊云科技 Glue Studio 的 监控 页面上,您可以监控您在特定任务运行上花费的 DPU 时长。以下屏幕截图显示了处理相同数据集的三次作业运行;第一次作业运行花费了 0.66 个 DPU 小时,第二次运行花费了 0.44 个 DPU 小时。使用 Flex 的第三个只用了 0.32 个 DPU 小时。

Glue Studio Job Run Monitoring

getJobRun 和 getJobruns API

可以通过 亚马逊云科技 API 检索每次任务运行的 DPU 小时值。

对于自动扩展任务和 Flex 作业,getJobR un 和 getJob runs API 响应中提供字段 dpusEc onds:

$ aws glue get-job-run --job-name ghcn --run-id jr_ccf6c31cc32184cea60b63b15c72035e31e62296846bad11cd1894d785f671f4
{
    "JobRun": {
        "Id": "jr_ccf6c31cc32184cea60b63b15c72035e31e62296846bad11cd1894d785f671f4",
        "Attempt": 0,
        "JobName": "ghcn",
        "StartedOn": "2023-02-08T19:14:53.821000+09:00",
        "LastModifiedOn": "2023-02-08T19:19:35.995000+09:00",
        "CompletedOn": "2023-02-08T19:19:35.995000+09:00",
        "JobRunState": "SUCCEEDED",
        "PredecessorRuns": [],
        "AllocatedCapacity": 10,
        "ExecutionTime": 274,
        "Timeout": 2880,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "LogGroupName": "/aws-glue/jobs",
        "GlueVersion": "3.0",
        "ExecutionClass": "FLEX",
        "DPUSeconds": 1137.0
    }
}

dpusEconds 字段返回 1137.0。这意味着 0.32 个 DPU 小时数,可以用 1137.0 /(60*60) =0.32 来计算。

对于其他没有自动缩放的标准作业, dpusEconds 字段不可用 :

$ aws glue get-job-run --job-name ghcn --run-id jr_10dfa93fcbfdd997dd9492187584b07d305275531ff87b10b47f92c0c3bd6264
{
    "JobRun": {
        "Id": "jr_10dfa93fcbfdd997dd9492187584b07d305275531ff87b10b47f92c0c3bd6264",
        "Attempt": 0,
        "JobName": "ghcn",
        "StartedOn": "2023-02-07T16:38:05.155000+09:00",
        "LastModifiedOn": "2023-02-07T16:40:48.575000+09:00",
        "CompletedOn": "2023-02-07T16:40:48.575000+09:00",
        "JobRunState": "SUCCEEDED",
        "PredecessorRuns": [],
        "AllocatedCapacity": 10,
        "ExecutionTime": 157,
        "Timeout": 2880,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "LogGroupName": "/aws-glue/jobs",
        "GlueVersion": "3.0",
        "ExecutionClass": "STANDARD"
    }
}

对于这些作业,您可以按 执行时间*最大容量/ (60*60) 计算 DPU 工时 。 然后你每小时获得 157*10/ (60* 60) =0.44 的 DPU。 请注意,亚马逊云科技 Glue 2.0 及更高版本的最低账单为 1 分钟。

亚马逊云科技 CloudFormation 模板

由于可以通过 getJobRu n 和 GetJob runs API 检索 DPU 时长,因此您可以将其与亚马逊 CloudWatch 等其他服务集成, 以监控 DPU 使用时长 随时间变 化的趋势。例如,您可以配置 亚马逊 Event B ridge 规则,调用 亚马逊云科技 Lambda 函数,在每次 亚马逊云科技 Glue 任务 完成时 发布 CloudWatch 指标。

为了帮助您快速进行配置,我们提供了一 个 亚马逊云科技 CloudFormation 模板 。您可以对其进行查看和自定义,以满足您的需求。该堆栈部署的某些资源在使用时会产生成本。

CloudFormation 模板生成以下资源:

  • 亚马逊云科技 身份和访问管理 (IAM) 角色
  • Lambda 函数
  • EventBridge 规则

要创建资源,请完成以下步骤:

  1. 登录 亚马逊云科技 CloudFormation 控制台。
  2. 选择启动堆栈:
  3. 选择 “ 下一步 ” 。
  4. 选择 “ 下一步 ” 。
  5. 在下一页上,选择 “ 下一步 ” 。
  6. 查看最后一页上的详细信息,然后选择 “ 我承认 亚马逊云科技 CloudFormation 可能会创建 IAM 资源 ”。
  7. 选择 创建堆栈

创建堆栈最多可能需要 3 分钟。

在您完成堆栈创建后,当 亚马逊云科技 Glue 任务完成时,以下 DpuHours 指标将在 CloudWatch 的 Glue 命名空间下发布:

  • 汇总指标 — Dimension= [jobType、GlueVersion、ExecutionClass]
  • 每份工作指标 — 维度= [jobName,jobrunid=全部]
  • 每项作业运行指标 — Dimension= [jobName,jobrunid]

汇总指标和每项任务指标如以下屏幕截图所示。

CloudWatch DPUHours Metrics

每个数据点代表每个作业运行的 dpuHours,因此 CloudWatch 指标的有效统计数据为 SUM。借助 CloudWatch 指标,您可以详细了解 DPU 时长。

优化成本的选项

本节介绍在适用于 Apache Spark 的 亚马逊云科技 Glue 上优化成本的关键选项:

  • 升级到最新版本
  • 自动缩放
  • 屈伸
  • 适当设置作业的超时时间
  • 互动会议
  • 适用于直播工作的较小员工类型

我们将深入研究各个选项。

升级到最新版本

让 亚马逊云科技 Glue 任务运行在最新版本上使您能够利用 亚马逊云科技 Glue 提供的最新功能和改进以及 Apache Spark 等支持引擎的升级版本。例如,亚马逊云科技 Glue 4.0 包含经过优化的新版 Apache Spark 3.3.0 运行环境,增加了对内置熊猫 API 的支持以及对 Apache Hudi、Apache Iceberg 和 Delta Lake 格式的原生支持,从而为你提供了更多分析和存储数据的选项。它还包括一款全新的高性能 Amazon Redshift连接器,在TPC-DS基准测试中速度快了10倍。

自动缩放

降低成本最常见的挑战之一是确定合适的资源来运行作业。用户倾向于为避免资源相关问题而过度配置员工,但是其中一部分DPU未被使用,这不必要地增加了成本。从 亚马逊云科技 Glue 3.0 版开始,亚马逊云科技 Glue 自动扩展可帮助您根据工作负载动态地向上和向下扩展批处理任务和流式处理任务的资源。Auto Scaling 减少了优化工作人员数量的需求,以避免为工作过度配置资源或为闲置员工付费。

要在 亚马逊云科技 Glue Studio 上启用自动扩展,请转到您的 亚马逊云科技 Glue 任务的 “任务详情 ” 选项卡,然后选择 “ 自动扩展工作人员数量 ” 。

Glue Auto Scaling

你可以在 亚马逊云科技 Glue Auto Scaling 简介中了解更多信息:使用优化的 Apache Spark 自动调整无服务器计算资源的大小以降低成本

屈伸

对于不需要快速任务启动时间或有能力在出现故障时重新运行作业的非紧急数据集成工作负载, Flex 可能是一个不错的选择。使用 Flex 的作业的开始时间和运行时间各不相同,因为备用计算资源并不总是立即可用,并且可能在作业运行期间被回收。基于 Flex 的作业提供相同的功能,包括访问自定义连接器、可视化作业创作体验和作业调度系统。使用 Flex 选项,您可以将数据集成工作负载的成本优化多达 34%。

要在 亚马逊云科技 Glue Studio 上启用 Flex,请转到 任务的 “任务详情 ” 选项卡,然后选择 “ 弹性执行 ” 。

Glue Flex

您可以在 简介 亚马逊云科技 Glue Flex 工作中了解更多信息:节省 ETL 工作负载 的成本

互动会议

创建 亚马逊云科技 Glue 任务的开发人员的一种常见做法是,每次修改代码时都会多次运行同一个作业。但是,这可能不具有成本效益,具体取决于分配给该作业的工作人员数量和运行该作业的次数。此外,这种方法可能会减慢开发时间,因为你必须等到每个作业运行完成。为了解决这个问题,我们在 2022 年发布了 亚马逊云科技 Glue 互动会话 。此功能允许开发人员使用他们选择的 基于 Jupyter 的笔记本电脑或 IDE 以交互方式处理数据。会话在几秒钟内开始,并具有内置的成本管理功能。与 亚马逊云科技 Glue 任务一样,您只需为使用的资源付费。交互式会话允许开发人员逐行测试他们的代码,而无需运行整个作业来测试对代码所做的任何更改。

适当设置作业的超时时间

由于配置问题、脚本编码错误或数据异常,有时 亚马逊云科技 Glue 任务可能需要很长时间或难以处理数据,并且可能导致意外收费。亚马逊云科技 Glue 使您能够为任何任务设置超时值。默认情况下,亚马逊云科技 Glue 任务配置为 48 小时作为超时值,但您可以指定任何超时时间。我们建议您确定作业的平均运行时间,并在此基础上设置适当的超时时间。这样,您可以控制每次作业运行的成本,防止意外收费,并尽早发现与作业相关的任何问题。

要更改 亚马逊云科技 Glue Studio 上的超时值,请转到 任务的 “任务详情 ” 选项卡,然后输入 任务超时 值 。

Glue job timeout

交互式会话还具有在会话上设置空闲超时值的相同功能。Spark ETL 会话的默认空闲超时值为 2880 分钟(48 小时)。要更改超时值,你可以使用 %idle_ timeout 魔法。

适用于直播工作的较小员工类型

实时处理数据是客户的常见用例,但有时这些流的数据量是零星的,而且数据量很少。对于这些工作负载,G.1X 和 G.2X 工作人员类型可能太大,特别是当我们考虑到流媒体作业可能需要全天候运行时。为了帮助您降低成本,我们在 2022 年发布了 G.025X ,这是一种新的季度 DPU 员工类型,用于直播 ETL 职位。使用这种新的工作人员类型,您可以以四分之一的成本处理低数据量流。

要在 亚马逊云科技 Glue Studio 上选择 G.025X 工作人员类型,请转到任务的 “ 作业详情 ” 选项卡。对于 类型 ,选择 Spark Stre aming ,然后 为 工作人员 类型选择 G 0.25X

Glue smaller worker

您可以在 优化 亚马逊云科技 Glue 流式传输 ETL 任务 的成本和性能 的最佳实践 中了解更多信息。

性能调整以优化成本

性能调整在降低成本方面起着重要作用。性能调整的第一个操作是识别瓶颈。如果不测量性能和找出瓶颈,经济高效地进行优化是不现实的。 CloudWatch 指标 为快速分析提供了一个简单的视图,而 Spark 用户界面 为性能调整提供了更深入的视图。强烈建议 为作业 启用 Spark UI , 然后查看用户界面以识别瓶颈。

以下是优化成本的高级策略:

  • 扩展集群容量
  • 减少扫描的数据量
  • 并行处理任务
  • 优化洗牌
  • 克服数据偏差
  • 加快查询规划

在这篇文章中,我们将讨论减少扫描的数据量和并行处理任务的技术。

减少扫描的数据量:启用作业书签

亚马逊云科技 Glue 任务书签 是一种在计划间隔内多次运行任务时以增量方式处理数据的功能。如果您的用例是增量数据加载,则可以启用作业书签以避免对所有作业运行进行全面扫描,并仅处理上次作业运行后的增量。这减少了扫描的数据量并加快了单个作业的运行。

减少扫描的数据量:分区修剪

如果事先对输入数据进行了分区,则可以通过修剪分区来减少数据扫描量。

对于 亚马逊云科技 Glue DynamicFrame,设置 push_down_predicate (和 Cat alogPar t itionPredicate),如以下代码所示。要了解更多信息,请参阅在 亚马逊云科技 Glue 中 管理 ETL 输出的分区。

# DynamicFrame
dyf = Glue_context.create_dynamic_frame.from_catalog(
    database=src_database_name,
    table_name=src_table_name,
    push_down_predicate = "year='2023' and month ='03'",
)

对于 Spark DataFrame(或 Spark SQL),设置一个 where 或 filter 子句来修剪分区:

# DataFrame
df = spark.read.format("json").load("s3://<YourBucket>/year=2023/month=03/*/*.gz")
 
# SparkSQL 
df = spark.sql("SELECT * FROM <Table> WHERE year= '2023' and month = '03'")

并行化任务:并行化 JDBC 读取

来自 JDBC 源的并发读取次数由配置决定。请注意,默认情况下,单个 JDBC 连接将通过 SE LE CT 查询从源读取所有数据。

亚马逊云科技 Glue DynamicFrame 和 Spark DataFrame 都支持通过拆分数据集来对多个任务进行并行数据扫描。

对于 AWS Glue DynamicFrame,设置 哈希域 或哈希表达 式和 哈希 分区。 要了解更多信息,请参阅并行 读取 JDBC 表。

对于 Spark DataFrame,设置 分区数 、 分区 、下限和上限。 JDBC 到其他 数据库中了解更多信息。

结论

在这篇文章中,我们讨论了在适用于 Apache Spark 的 亚马逊云科技 Glue 上监控和优化成本的方法。使用这些技术,您可以有效监控和优化 亚马逊云科技 Glue for Spark 的成本。

如果您有意见或反馈,请在评论中留言。

附录:亚马逊 CloudWatch 收费

当您将亚马逊 CloudWatch 与 亚马逊云科技 Glue 任务一起使用时,您需要按标准费率收取 CloudWatch 指标和 CloudWatch Logs 的费用。在 亚马逊 CloudWatch 定价中了解更多信息。

  • 任务指标 :启用任务指标并创建 CloudWatch 自定义指标时,您会产生额外费用。
  • 应用程序日志 :在 CloudWatch 日志 组 /aws-glue/jobs/output 和 /aws-glue/jobs/ error 中汇总应用程序日志需要支付额外费用。
  • 持续日志记录 :启用持续日志记录 并且 CloudWatch 日志事件在 CloudWatch 日志组 /aws-glue/jobs/logs-v2 中发出,则会产生额外费用。

当您想要优化与 Glue 任务相关的 CloudWatch 费用时,首先应在 亚马逊云科技 Cost Explorer 中看到明细信息。

优化 CloudWatch 指标的成本

为了减少指标费用,您可以禁用工作指标。请注意,这篇文章中提供的CloudFormation模板创建了自定义指标,您还会因此产生额外费用。

优化 CloudWatch 日志的成本

CloudWatch Logs 的定价主要定义为摄取和存档存储。

要减少日志提取的费用,您可以执行以下操作:

  • 减少作业脚本中不需要的日志记录,例如 print () df.show () 自定义记录器调用
  • 配置 标准日志过滤器 而不是 不配置过滤器
  • 避免将生产作业的日志级别设置 为 D EBUG

要降低日志存档存储费用,您可以为日志组配置保留期。要了解更多信息,请参阅 CloudWatch 日志中的 更改日志 数据保留期


作者简介

莱昂纳多·戈麦斯 是 亚马逊云科技 首席分析专家解决方案架构师。他在数据管理方面拥有十多年的经验,可以帮助全球客户满足其业务和技术需求。在 LinkedIn 上联系他

关山 则隆 是 亚马逊云科技 Glue 团队的首席大数据架构师。他负责构建软件工件以帮助客户。在业余时间,他喜欢骑着新的公路自行车骑自行车。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。