使用 Apache Spark Web UI 监控作业 - AWS Glue

使用 Apache Spark Web UI 监控作业

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

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

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

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

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

有关使用 Spark Web UI 的更多信息,请参阅 Spark 文档中的 Web UI

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

您可以使用 AWS Glue 控制台或 AWS Command Line Interface (AWS CLI) 启用 Spark UI。在启用 Spark UI 后,AWS Glue 开发端点上的 AWS Glue ETL 作业和 Spark 应用程序可将 Spark 事件日志保留到您在 Amazon Simple Storage Service(Amazon S3)中指定的位置。当任务正在执行时以及在任务完成后,Amazon S3 中保留的事件可实时用于 Spark UI。只要日志保留在 Amazon S3 中,即可在 AWS Glue 控制台中通过 Spark UI 进行查看。

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

限制:

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

  • AWS 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,AWS 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 查询计划:已解析、已分析和已优化的逻辑计划以及执行的物理计划。