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

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

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

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

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

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

批量指标重要信息

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

批次指标信息中心。

指标表

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

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

作业日志

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

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

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

批处理日志浏览器。

Spark 界面

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

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

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

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

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

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

打开 Spark 界面

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

  1. 前往 Serverless for Apache Spark 交互式会话页面。

    转到 Dataproc 批次

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

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

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

Serverless for Apache Spark 日志

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

查询 Serverless for Apache Spark 日志

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

  1. 转到 Logs Explorer

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

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

      1. 所有资源下,选择 Cloud Dataproc 批处理作业资源。

        1. 选择资源面板中,依次选择批次位置批次 ID。这些批处理参数列在 Google Cloud 控制台中的 Dataproc 批处理页面上。

        2. 点击应用

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

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

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

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

        • BATCH_UUID:批次 UUID 列在 Google Cloud 控制台的“批次详情”页面中,当您点击批次页面上的“批次 ID”时,系统会打开该页面。

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

  4. 点击运行查询

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

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

  1. dataproc.googleapis.com/output:此日志文件包含批量工作负载输出。Serverless 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/spark:此命名空间用于汇总在 Dataproc 集群主服务器虚拟机和工作虚拟机上运行的守护程序和执行器的 Spark 日志。spark每个日志条目都包含一个 masterworkerexecutor 组件标签,用于标识日志来源,如下所示:

    • executor:来自用户代码执行器的日志。这些通常是分布式日志。
    • master:来自 Spark 独立资源管理器主实例的日志,类似于 Dataproc on Compute Engine YARN ResourceManager 日志。
    • worker:来自 Spark 独立资源管理器工作器的日志,类似于 Dataproc on Compute Engine 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"="gdpic-srvls-batch-BATCH_UUID-VM_SUFFIX"
    
  4. dataproc.googleapis.com/agentagent 命名空间会汇总 Dataproc 代理日志。每个日志条目都包含用于标识日志来源的文件名标签。

    由指定工作器虚拟机生成的代理日志的 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"="gdpic-srvls-batch-BATCHUUID-wWORKER#"
    

  5. dataproc.googleapis.com/autoscalerautoscaler 命名空间会汇总 Serverless 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"="gdpic-srvls-batch-BATCHUUID-wWORKER#"
    

如需了解详情,请参阅 Dataproc 日志

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

工作负载指标

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

批量指标

Dataproc batch 资源指标可提供有关批处理资源(例如批处理执行程序的数量)的深入分析。批次指标以 dataproc.googleapis.com/batch 为前缀。

Metrics Explorer 中的批次指标示例。

Spark 指标

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

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

Metrics Explorer 中的 Spark 指标示例。

设置指标提醒

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

创建图表

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

Cloud Monitoring

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

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

创建信息中心

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

Persistent History Server

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

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

  1. 创建 Dataproc Persistent History Server (PHS)

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

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

自动调节

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

控制台

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

  1. 在 Google Cloud 控制台中,前往 Dataproc 批次页面。

    转到 Dataproc 批次

  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 辅助分析会应用于使用此群组名称提交的第二个及后续工作负载。例如,将每天运行 TPC-H 查询的已安排工作负载的群组名称指定为 TPCH Query 1

API

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

示例:

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