使用 Apache Spark Web UI 监控作业 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Apache Spark Web UI 监控作业

可以使用 Apache Spark Web UI 监控和调试在 Amazon Glue 作业系统上运行的 Amazon Glue ETL 作业以及在 Amazon Glue 开发终端节点上运行的 Spark 应用程序。可使用 Spark UI 检查每个作业的以下内容:

  • 每个 Spark 阶段的事件时间表

  • 作业的有向非循环图 (DAG)

  • SparkSQL 查询的物理和逻辑计划

  • 每个作业的基础 Spark 环境变量

有关使用 Spark Web UI 的更多信息,请参阅 Spark 文档中的 Web UI。有关如何解释 Spark UI 结果以提高作业性能的指导,请参阅《Amazon 规范性指南》中的 优化 Amazon Glue for Apache Spark 作业性能的最佳实践

对于较新的任务,您可以在 Amazon Glue 控制台中查看 Spark UI。当 Amazon Glue 任务在 Amazon Glue 3.0 或更高版本上运行,并且日志以标准(而不是传统)格式(对于较新的任务,默认格式为标准)生成时,可以使用此功能。有关在控制台中查找 Spark UI 的更多信息,请参阅 查看最近任务运行的信息。对于其他版本的 Amazon Glue,请预置自己的历史记录服务器。有关更多信息,请参阅 启动 Spark 历史记录服务器

您可以使用 Amazon Glue 控制台或 Amazon Command Line Interface (Amazon CLI) 启用 Spark UI。在启用 Spark UI 后,Amazon Glue 开发端点上的 Amazon Glue ETL 任务和 Spark 应用程序可将 Spark 事件日志备份到您在 Amazon Simple Storage Service (Amazon S3) 中指定的位置。您可以将 Amazon S3 中备份的事件日志与 Spark UI 一起使用,既可以在任务运行时实时使用,也可以在任务完成后使用。日志保留在 Amazon S3 中时,Amazon Glue 控制台中的 Spark UI 可以查看它们。

要在 Amazon Glue 控制台中使用 Spark UI,您的控制台角色必须具有 glue:UseGlueStudio 权限。有关此权限的更多信息,请参阅 为 Amazon Glue Studio 创建自定义 IAM policy

限制:

  • Amazon Glue 控制台中的 Spark UI 不适用于 2023 年 11 月 20 日之前的任务运行,因为此类任务采用旧版日志格式。

  • Amazon Glue 控制台中的 Spark UI 不支持滚动日志,例如流式处理作业中默认生成的日志。

    您可以通过传递额外配置来关闭流式处理任务的滚动日志功能。请注意,非常大的日志文件的维护成本可能很高。

    要关闭滚动日志,请提供以下配置:

    '--spark-ui-event-logs-path': 'true', '--conf': 'spark.eventLog.rolling.enabled=false'

示例:Apache Spark Web UI

此示例演示了如何使用 Spark UI 了解任务性能。屏幕截图显示了由自行管理的 Spark 历史记录服务器提供的 Spark Web UI。Amazon Glue 控制台中的 Spark UI 提供了类似视图。有关使用 Spark Web UI 的更多信息,请参阅 Spark 文档中的 Web UI

以下是一个示例 Spark 应用程序,其从两个数据源读取数据,执行联接转换,并以 Parquet 格式将其写入 Amazon S3。

import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.sql.functions import count, when, expr, col, sum, isnull from pyspark.sql.functions import countDistinct from awsglue.dynamicframe import DynamicFrame args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME']) df_persons = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/persons.json") df_memberships = spark.read.json("s3://awsglue-datasets/examples/us-legislators/all/memberships.json") df_joined = df_persons.join(df_memberships, df_persons.id == df_memberships.person_id, 'fullouter') df_joined.write.parquet("s3://aws-glue-demo-sparkui/output/") job.commit()

以下 DAG 可视化显示此 Spark 作业中的各个阶段。


      Spark UI 的屏幕截图,显示了作业 0 的 2 个已完成阶段。

以下作业事件时间表显示了各个 Spark 执行程序的启动、执行和终止。


      Spark UI 的屏幕截图,显示了各个 Spark 执行程序的已完成、失败和活动阶段。

以下屏幕显示了 SparkSQL 查询计划的详细信息:

  • 已解析的逻辑计划

  • 已分析的逻辑计划

  • 已优化的逻辑计划

  • 执行的物理计划


      SparkSQL 查询计划:已解析、已分析和已优化的逻辑计划以及执行的物理计划。