使用 Spark UI 进行调试

本文概述了一些可用于 Apache Spark 应用程序的调试选项:

  • Spark用户界面
  • 驱动程序日志
  • 执行程序日志

请参阅使用 Spark UI 诊断成本和性能问题,来逐步了解如何使用 Spark UI 诊断成本和性能问题。

Spark用户界面

启动作业后,Spark UI 会显示有关应用程序中发生的情况的信息。 若要访问 Spark UI,请从 “计算 ”页中选择计算,然后单击 “Spark UI ”选项卡:

Spark UI

“流式处理”选项卡

在 Spark UI 中,如果在计算上运行流式处理作业,你将看到“流式处理”选项卡。 如果此计算中未运行流式处理作业,则此选项卡不可见。 你可跳到驱动程序日志了解如何检查启动流式处理作业时可能发生的异常。

通过此页面,您可以检查流媒体应用程序是否正在从源接收任何输入事件。 例如,你可能会看到作业接收 1000 个事件/秒。

注意

对于 TextFileStream,由于文件是输入的,因此输入事件的数量始终为 0。 在这种情况下,可以查看笔记本中的已完成批处理部分,了解如何查找详细信息。

如果你有一个接收多个输入流的应用程序,则可单击“输入速率”链接,该链接将显示每个接收器接收的事件数。

处理时间

向下滚动,找到“处理时间”关系图。 这是了解流式处理作业性能的关键图之一。 一般来说,如果你可在批处理时间的 80% 内处理每个批,那就很好。

如果平均处理时间接近或大于批处理时间间隔,则你的流式处理应用程序将开始排队,很快就会导致积压工作 (backlog),最终导致流式处理作业失败。

已完成的批处理

在页面末尾,你将看到所有已完成的批处理列表。 页面显示有关最近完成的 1000 个批处理的详细信息。 从表中,你可以获得每个批处理的事件数及其处理时间。 如果想要了解有关其中一个批处理上发生的情况的详细信息,可以单击批处理链接以访问 “批处理详细信息 ”页。

“批处理详细信息”页

批处理详细信息 ”页包含有关批处理的所有详细信息。 两个关键事项:

  • 输入:包含有关批处理输入的详细信息。 在本例中,它包含有关 Apache Kafka 主题、Spark 结构化流式处理为此批处理读取的分区和偏移量的详细信息。 对于 TextFileStream,你将看到为此批处理读取的文件名列表。 对于从文本文件读取的流式处理应用程序,这是启动调试的最佳方式。
  • 处理:可以单击作业 ID 的链接,其中包含在此批处理期间完成的处理的所有相关详细信息。

“作业详细信息”页

作业详细信息页显示 DAG 可视化。 这对于了解每个批处理的作顺序和依赖项非常有用。 例如,这可能显示从 Kafka 直接流中批量读取输入,然后进行平面映射操作,再进行映射操作,接着将生成的流用于通过 updateStateByKey 更新全局状态。

灰色框表示跳过的阶段。 如果某些阶段不需要重新计算,Spark 足够智能,可以跳过这些阶段。 如果数据是检查点或缓存的,Spark 将跳过重新计算这些阶段。 在前面的流式处理示例中,这些阶段由于updateStateBykey的原因,与之前的批处理存在依赖关系。 由于 Spark 结构化流在内部对流进行检查点设置,并从检查点读取,而不是依赖以前的批处理,因此这些阶段显示为灰色。

在页面底部,还可找到为此批处理执行的作业列表。 可以单击说明中的链接,以深入了解任务级别的执行。

“任务详细信息”页

对于 Spark 应用程序,这是可从 Spark UI 获取的最精细调试级别。 此页面包含为此批处理执行的所有任务。 如果您正在调查流媒体应用程序的性能问题,页面将提供诸如执行的任务数量、任务执行的位置(即哪台执行程序)以及数据洗牌信息等信息。

提示

请确保任务在计算中的多个执行程序(节点)上执行,以便在处理时具有足够的并行度。 如果你只有一个接收器,可能有时只有一个执行器来执行所有工作,尽管计算中有多个执行器。

线程转储

线程转储显示 JVM 线程状态的快照。

在调试特定挂起或运行缓慢的任务时,线程转储很有用。 若要在 Spark UI 中查看特定任务的线程转储:

  1. 单击“作业”选项卡。

  2. 在“作业”表中,找到与要查看的线程转储对应的目标作业,然后单击“说明”列中的链接。

  3. 在作业的“阶段”表中,找到与要查看的线程转储对应的目标阶段,然后单击“说明”列中的链接。

  4. 在阶段的“任务”列表中,找到与要查看的线程转储对应的目标任务,并记下其“任务 ID”和“执行程序 ID”。

  5. 单击“执行程序”选项卡。

  6. 在“执行程序”表中,找到包含与之前记下的“执行程序 ID”值对应的“执行程序 ID”值的行。 在该行中,单击“线程转储”列中的链接。

  7. 在“执行程序的线程转储”表中,单击“线程名称”列包含 (TID) 的行,后跟前面记下的“任务 ID”值。 (如果任务已完成运行,则找不到匹配的线程)。 显示任务的线程转储。

对于调试驱动程序似乎挂起(例如,没有显示 Spark 进度条)或查询没有进展(例如,Spark 进度条停滞在 100%)的问题,线程转储也很有用。 若要在 Spark UI 中查看驱动程序的线程转储:

  1. 单击“执行程序”选项卡。

  2. 在“执行程序”表的“驱动程序”行中,单击“线程转储”列中的链接。 显示驱动程序的线程转储。

驱动程序日志

在以下情况下,驱动程序日志非常有用:

  • 异常:有时,Spark UI 中可能未显示“流式处理”选项卡。 这是因为流式处理作业由于某些异常而未启动。 你可以深入驱动程序日志,查看异常的堆栈跟踪。 在某些情况下,流式处理作业可能已正常启动。 但你会发现所有批处理永远不会转到“已完成的批处理”部分。 它们可能都处于“正在处理”或“已失败”状态。 在这些情况下,驱动程序日志也有助于了解根本问题的性质。
  • Print:作为 DAG 一部分的任何 print 语句也会显示在日志中。

注意

谁可以访问驱动程序日志取决于计算资源的访问模式。 对于使用 标准 访问模式的计算,只有工作区管理员可以访问驱动程序日志。 对于具有 专用 访问模式的计算,专用用户或组和工作区管理员可以访问驱动程序日志。

执行程序日志

如果看到某些任务行为不当,并且希望看到特定任务的日志,则执行程序日志非常有用。 在上面所示的“任务详细信息”页中,可以获取运行任务的执行程序。 在获得该程序后,可转到计算 UI 页面,单击 # 节点,然后单击主节点。 主节点页会列出所有工作节点。 可选择运行可疑任务的工作节点,然后转到 log4j 输出。

注意

执行程序日志不适用于 具有标准 访问模式的计算。 对于具有 专用 访问模式的计算,专用用户或组和工作区管理员可以访问执行程序日志。