监控和排查批处理工作负载问题

本文档介绍了可用于监控和排查 Managed Service for Apache Spark 批量工作负载的工具和文件。

通过 Google Cloud 控制台排查工作负载问题

如果批量作业失败或效果不佳,建议您先在 Google Cloud 控制台的批处理页面中打开该作业的批处理详情页面。

使用“摘要”标签页:问题排查中心

批次详情页面打开时,系统会默认选择摘要标签页,该标签页会显示关键指标和过滤后的日志,帮助您快速初步评估批次健康状况。完成初步评估后,您可以使用批处理详情页面中提供的更专业的工具(例如 Spark 界面Logs ExplorerGemini Cloud Assist)进行更深入的分析。

批量指标重要信息

批次详情页面上的摘要标签页包含显示重要批次工作负载指标值的图表。指标图表会在完成之后填充,并直观地显示潜在问题,例如资源争用、数据倾斜或内存压力。

批处理指标信息中心。

指标表格

下表列出了 Google Cloud 控制台的批处理详情页面上显示的 Spark 工作负载指标,并介绍了指标值如何提供有关工作负载状态和性能的分析洞见。

指标 显示哪些信息?
执行器级指标
JVM GC 时间与运行时的比率 此指标显示每个执行器的 JVM GC(垃圾收集)时间与运行时之间的比率。较高的比率可能表明在特定执行器上运行的任务中存在内存泄漏或数据结构效率低下,这可能会导致对象周转率过高。
溢出到磁盘的字节数 此指标显示了不同执行器溢出的磁盘字节总数。如果执行器显示磁盘溢出字节数较高,则可能表示存在数据倾斜。如果该指标随时间推移而增加,则可能表明存在内存压力或内存泄漏的阶段。
读取和写入的字节数 此指标显示了每个执行器的写入字节数与读取字节数。读取或写入的字节数存在较大差异可能表明,在某些执行器上,复制联接会导致数据放大。
读取和写入的记录 此指标显示每个执行器读取和写入的记录数。读取记录数远高于写入记录数可能表明特定执行器的处理逻辑存在瓶颈,导致记录在等待时被读取。如果执行器在读取和写入方面始终滞后,则可能表明这些节点上存在资源争用,或者执行器特定的代码效率低下。
Shuffle 写入时间与运行时间的比率 该指标显示了执行器在 Shuffle 运行时所花费的时间与总运行时的比较。如果某些执行器的此值较高,则可能表明存在数据倾斜或数据序列化效率低下。 您可以在 Spark 界面中识别 shuffle 写入时间较长的阶段。查找这些阶段中完成时间超过平均时间的异常任务。检查具有高 Shuffle 写入时间的执行器是否也显示出高磁盘 I/O 活动。更高效的序列化和额外的分区步骤可能会有所帮助。与记录读取相比,记录写入量过大可能表明由于连接效率低下或转换不正确而导致了意外的数据重复。
应用级指标
阶段进程 此指标显示处于失败、等待和运行阶段的阶段数。大量失败或等待阶段可能表明存在数据倾斜。检查数据分区,并使用 Spark 界面中的阶段标签页调试阶段失败的原因。
Batch Spark 执行程序 此指标显示了可能需要的执行程序数量与正在运行的执行程序数量。所需执行器与正在运行的执行器之间的巨大差异可能表明存在自动扩缩问题。
虚拟机级指标
使用的内存 此指标显示了正在使用的虚拟机内存百分比。如果主百分比较高,则可能表示驱动程序内存不足。对于其他虚拟机节点,百分比较高可能表示执行程序内存不足,这可能会导致磁盘溢出严重,并减慢工作负载运行时速度。使用 Spark 界面分析执行器,以检查是否存在 GC 时间过长和任务失败次数过多的情况。此外,还可调试 Spark 代码,以实现大型数据集缓存和不必要的变量广播。

作业日志

批次详情页面包含作业日志部分,其中列出了从作业(批量工作负载)日志中过滤出的警告和错误。借助此功能,您可以快速识别严重问题,而无需手动解析大量日志文件。您可以从下拉菜单中选择日志严重程度(例如 Error),并添加文本过滤条件来缩小结果范围。如需进行更深入的分析,请点击在 Logs Explorer 中查看图标,以在Logs Explorer中打开所选的批处理日志。

在 Cloud Logging 中查看批处理日志
在 Cloud Logging 中查看批处理日志

示例:在 Google Cloud 控制台的批处理详情页面上,从严重程度选择器中选择 Errors 后,Logs Explorer 随即打开。

批处理日志浏览器。

Spark 界面

Spark 界面会从 Managed Service for Apache Spark 批量工作负载中收集 Apache Spark 执行详情。Spark 界面功能可免费使用,并且默认处于启用状态。

Spark 界面功能收集的数据会保留 90 天。您可以使用此网页界面来监控和调试 Spark 工作负载,而无需创建永久性历史记录服务器

所需的 Identity and Access Management 权限和角色

如需将 Spark 界面功能与批处理工作负载搭配使用,需要以下权限。

  • 数据收集权限:dataproc.batches.sparkApplicationWrite。必须向运行批处理工作负载的服务账号授予此权限。此权限包含在 Managed Service for Apache Spark Worker 角色中,该角色会自动授予给 Managed Service for Apache Spark 默认使用的 Compute Engine 默认服务账号(请参阅 Managed Service for Apache Spark 服务账号)。 不过,如果您为批量工作负载指定了自定义服务账号,则必须向该服务账号添加 dataproc.batches.sparkApplicationWrite 权限(通常是通过向该服务账号授予 Managed Service for Apache Spark Worker 角色来实现)。

  • Spark 界面访问权限:dataproc.batches.sparkApplicationRead。必须向用户授予此权限,才能在Google Cloud 控制台中访问 Spark 界面。Dataproc ViewerDataproc EditorDataproc Administrator 角色拥有此权限。如需在 Google Cloud 控制台中打开 Spark 界面,您必须拥有以下角色之一,或者拥有包含此权限的自定义角色。

打开 Spark 界面

Spark 界面页面可在 Google Cloud 控制台批量工作负载中使用。

  1. 前往 Managed Service for Apache Spark 互动式会话页面。

    前往 Managed Service for Apache Spark 批处理

  2. 点击批次 ID 以打开批次详情页面。

  3. 点击顶部菜单中的 View Spark UI

在以下情况下,“查看 Spark 界面”按钮处于停用状态:

Managed Service for Apache Spark 日志

Managed Service for Apache Spark 中的日志记录默认处于启用状态,并且工作负载日志会在工作负载完成后保留。Managed Service for Apache Spark 会在 Cloud Logging 中收集工作负载日志。 您可以在日志浏览器中访问 Cloud Dataproc Batch 资源下的 Managed Service for Apache Spark 日志。

查询 Managed Service for Apache Spark 日志

Google Cloud 控制台中的 Logs Explorer 提供了一个查询窗格,可帮助您构建查询来检查批量工作负载日志。 您可以按照以下步骤构建查询,以检查批处理工作负载日志:

  1. 转到 Logs Explorer

  2. 系统已选择当前项目。您可以点击优化范围项目来选择其他项目。
  3. 定义批量日志查询。

    • 使用过滤条件菜单过滤出批处理工作负载。

      1. 所有资源下,选择 Cloud Managed Service for Apache Spark Batch 资源。

        1. 选择资源面板中,依次选择批次位置批次 ID。这些批次参数列在 Google Cloud 控制台的 Managed Service for Apache Spark 批次页面上。

        2. 点击应用

        3. 选择日志名称下,在搜索日志名称框中输入 dataproc.googleapis.com,以限制要查询的日志类型。选择一个或多个列出的日志文件名。

    • 使用查询编辑器过滤特定于虚拟机的日志。

      1. 指定资源类型和虚拟机资源名称,如以下示例所示:

        resource.type="cloud_dataproc_batch"
        labels."dataproc.googleapis.com/resource_name"="VM_NAME_PREFIX-BATCH_UUID-VM_SUFFIX"
        
        注意:

        • VM_NAME_PREFIX::对于在 Managed Service for Apache Spark 3.0 及更高运行时版本上运行的批量工作负载,请使用 gdpic-rm;对于在较低运行时版本上运行的批量工作负载,请使用 gdpic-srvls-batch
        • BATCH_UUID:批次 UUID 列在 Google Cloud 控制台的“批次详情”页面中,当您点击批次页面上的“批次 ID”时,该页面会打开。

        批量日志还会在虚拟机资源名称中列出批处理 UUID。以下是来自批处理 driver.log 的示例:

  4. 点击运行查询

Managed Service for Apache Spark 日志类型和查询示例

下表介绍了不同的 Managed Service for Apache Spark 日志类型,并针对每种日志类型提供了 Logs Explorer 查询示例。

  1. dataproc.googleapis.com/output:此日志文件包含批量工作负载输出。 Managed Service for Apache Spark 会将批处理输出流式传输到 output 命名空间,并将文件名设置为 JOB_ID.driver.log

    输出日志的 Logs Explorer 查询示例:

    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Foutput"
    

  2. dataproc.googleapis.com/sparkspark 命名空间用于汇总在 Managed Service for Apache Spark 集群主服务器和工作器虚拟机上运行的守护程序和执行器的 Spark 日志。每个日志条目都包含一个 masterworkerexecutor 组件标签,用于标识日志源,如下所示:

    • executor:来自用户代码执行器的日志。通常,这些是分布式日志。
    • master:来自 Spark 独立资源管理器主实例的日志,类似于 Managed Service for Apache Spark YARN ResourceManager 日志。
    • worker:来自 Spark 独立资源管理器工作器的日志,类似于 Managed Service for Apache Spark YARN NodeManager 日志。

    spark 命名空间中所有日志的 Logs Explorer 查询示例:

    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Fspark"
    

    以下是针对 spark 命名空间中 Spark 独立组件日志的 Logs Explorer 查询示例:

    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Fspark"
    jsonPayload.component="COMPONENT"
    

  3. dataproc.googleapis.com/startupstartup 命名空间包含批处理(集群)启动日志。包含所有初始化脚本日志。组件通过标签进行标识,例如:

    startup-script[855]: ... activate-component-spark[3050]: ... enable spark-worker
    
    用于在指定虚拟机上查找启动日志的 Logs Explorer 查询示例:
    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Fstartup"
    labels."dataproc.googleapis.com/resource_name"="VM_NAME_PREFIX-BATCH_UUID-VM_SUFFIX"
    
  4. dataproc.googleapis.com/agentagent 命名空间会汇总 Managed Service for Apache Spark 代理日志。每个日志条目都包含用于标识日志源的文件名标签。

    由指定工作器虚拟机生成的代理日志的 Logs Explorer 查询示例:

    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Fagent"
    labels."dataproc.googleapis.com/resource_name"="VM_NAME_PREFIX-BATCHUUID-wWORKER#"
    

  5. dataproc.googleapis.com/autoscalerautoscaler 命名空间会汇总 Managed Service for Apache Spark 自动扩缩器日志。

    针对指定工作器虚拟机生成的自动扩缩器日志的 Logs Explorer 查询示例:

    resource.type="cloud_dataproc_batch"
    resource.labels.location="REGION"
    resource.labels.batch_id="BATCH_ID"
    logName="projects/PROJECT_ID/logs/dataproc.googleapis.com%2Fautoscaler"
    labels."dataproc.googleapis.com/resource_name"="VM_NAME_PREFIX-BATCHUUID-wWORKER#"
    

如需了解详情,请参阅 Managed Service for Apache Spark 日志

如需了解 Managed Service for Apache Spark 审核日志,请参阅 Managed Service for Apache Spark 审核日志记录

工作负载指标

Managed Service for Apache Spark 提供批量指标和 Spark 指标,您可以在 Google Cloud 控制台中的Metrics Explorer批量详情页面中查看这些指标。

批量指标

Managed Service for Apache Spark batch 资源指标可提供有关批处理资源的深入分析,例如批处理执行器的数量。批次指标以 dataproc.googleapis.com/batch 为前缀。

Metrics Explorer 中的批量指标示例。

Spark 指标

默认情况下,Managed Service for Apache Spark 会启用可用的 Spark 指标的收集,除非您使用 Spark 指标收集属性来停用或替换一个或多个 Spark 指标的收集。

可用的 Spark 指标包括 Spark 驱动程序和执行器指标,以及系统指标。可用的 Spark 指标以 custom.googleapis.com/ 为前缀。

Metrics Explorer 中的 Spark 指标示例。

设置指标提醒

您可以创建 Managed Service for Apache Spark 指标提醒,以便收到有关工作负载问题的通知。

创建图表

您可以使用Google Cloud 控制台中的 Metrics Explorer 创建直观呈现工作负载指标的图表。例如,您可以创建一个显示 disk:bytes_used 的图表,然后按 batch_id 进行过滤。

Cloud Monitoring

监控功能使用工作负载元数据和指标来深入了解 Managed Service for Apache Spark 工作负载的运行状况和性能。 工作负载指标包括 Spark 指标、批处理指标和操作指标。

您可以在 Google Cloud 控制台中使用 Cloud Monitoring 来探索指标、添加图表、创建信息中心和创建提醒。

创建信息中心

您可以创建信息中心,以使用来自多个项目和不同 Google Cloud 产品的指标来监控工作负载。如需了解详情,请参阅创建和管理自定义信息中心

Persistent History Server

Managed Service for Apache Spark 会创建运行工作负载所需的计算资源,在这些资源上运行工作负载,然后在工作负载完成时删除这些资源。工作负载完成后,工作负载指标和事件不会保留。不过,您可以使用 Persistent History Server (PHS) 将工作负载应用历史记录(事件日志)保留在 Cloud Storage 中。

如需将 PHS 与批处理工作负载搭配使用,请执行以下操作:

  1. 创建 Managed Service for Apache Spark Persistent History Server (PHS)

  2. 提交工作负载时指定 PHS。

  3. 使用组件网关连接到 PHS,以查看应用详情、调度程序阶段、任务级详情以及环境和执行器信息。

自动调节

  • 为 Managed Service for Apache Spark 启用自动调优功能:您可以使用 Google Cloud 控制台、gcloud CLI 或 Managed Service for Apache Spark API 提交每个周期性 Spark 批量工作负载时,为 Managed Service for Apache Spark 启用自动调优功能。

控制台

请执行以下步骤,为每个周期性 Spark 批处理工作负载启用自动调优功能:

  1. 在 Google Cloud 控制台中,前往 Managed Service for Apache Spark 批量页面。

    前往 Managed Service for Apache Spark 批处理

  2. 如需创建批处理工作负载,请点击创建

  3. 容器部分中,填写群组名称,用于将批次标识为一系列周期性工作负载之一。 Gemini 辅助分析功能会应用于使用此群组名称提交的第二个及后续工作负载。例如,将 TPCH-Query1 指定为运行每日 TPC-H 查询的已安排工作负载的同类群组名称。

  4. 根据需要填写创建批次页面的其他部分,然后点击提交。如需了解详情,请参阅提交批处理工作负载

gcloud

在终端窗口或 Cloud Shell 中以本地方式运行以下 gcloud CLI gcloud dataproc batches submit 命令,以针对每个周期性 Spark 批处理工作负载启用自动调优:

gcloud dataproc batches submit COMMAND \
    --region=REGION \
    --cohort=COHORT \
    other arguments ...

替换以下内容:

  • COMMAND:Spark 工作负载类型,例如 SparkPySparkSpark-SqlSpark-R
  • REGION:工作负载将运行的区域
  • COHORT:群组名称,用于将批次标识为一系列周期性工作负载之一。 Gemini 辅助分析功能会应用于使用此群组名称提交的第二个及后续工作负载。例如,将 TPCH Query 1 指定为运行每日 TPC-H 查询的已安排工作负载的同类群组名称。

API

batches.create 请求中添加 RuntimeConfig.cohort 名称,以在每个周期性 Spark 批量工作负载上启用自动调节。自动调优功能会应用于使用此同类群组名称提交的第二个及后续工作负载。例如,将 TPCH-Query1 指定为运行每日 TPC-H 查询的已安排工作负载的同类群组名称。

示例:

...
runtimeConfig:
  cohort: TPCH-Query1
...