spark ui job和stage的dag图查看过去运行的任务,查不到,分析源码解决问题

本文主要是介绍spark ui job和stage的dag图查看过去运行的任务,查不到,分析源码解决问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目场景:

使用用2.x跑任务,产看耗时的spark job, stage,发现job和stage的dag信息缺失

问题描述:

sparkUI 显示dag信息缺失问题: 使用用2.x跑任务,查看spark 性能问题,从spark ui选择出最耗时的任务,进去查看,有一个任务有100多个job, 有几百个stage,程序跑完看前面 job和stage的dag图,提示没有了

按照UI提示,提高这两个值,发现一点用都没有,而且这两个值也没有超过spark的默认值1000,奇怪,怀疑是否spark ui提示错误信息了

问题如下图:
在这里插入图片描述

在这里插入图片描述
spark.ui.retainedStages=5000,总stage数量没有超过5000, job数量没有超过1000.

原因分析:

分析问题思路:从页面信息入手,进行源码分析

把页面提示信息,直接到spark源码里面进行搜索,找出页面信息
直接找出页面的源码(idea CTRL+SHIFT+F 搜索 No visualization information available )

function renderDagViz(forJob) {// If there is not a dot file to render, fail fast and report errorvar jobOrStage = forJob ? "job" : "stage";if (metadataContainer().empty() ||metadataContainer().selectAll("div").empty()) {var message ="<b>No visualization information available for this " + jobOrStage + "!</b><br/>" +"If this is an old " + jobOrStage + ", its visualization metadata may have been " +"cleaned up over time.<br/> You may consider increasing the value of ";if (forJob) {message += "<i>spark.ui.retainedJobs</i> and <i>spark.ui.retainedStages</i>.";} else {message += "<i>spark.ui.retainedStages</i>";}graphContainer().append("div").attr("id", "empty-dag-viz-message").html(message);return;}

在这里插入图片描述

在这里插入图片描述
原来点击DAG显示,的js里面把dag-viz-metadata进行显示和隐藏而已,说明数据是之前就生成好了,只是目前数据是空的。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

改了还不行:
继续查StagePage.class 搜索dag

 val dagViz = UIUtils.showDagVizForStage(stageId, operationGraphListener.getOperationGraphForStage(stageId))
找到:/** Return the graph metadata for the given stage, or None if no such information exists. */def getOperationGraphForStage(stageId: Int): Option[RDDOperationGraph] = synchronized {stageIdToGraph.get(stageId)}

stageIdToGraph 的stage信息删除是由cleanStage引起的

/** Clean metadata for the given stage, its job, and all other stages that belong to the job. */private[ui] def cleanStage(stageId: Int): Unit = {completedStageIds.remove(stageId)stageIdToGraph.remove(stageId)stageIdToJobId.remove(stageId).foreach { jobId => cleanJob(jobId) }
}

找找在哪触发cleanStage,发现在trimStagesIfNecessary和trimJobsIfNecessary触发

/** Clean metadata for old stages if we have exceeded the number to retain. */
private def trimStagesIfNecessary(): Unit = {if (stageIds.size >= retainedStages) {val toRemove = math.max(retainedStages / 10, 1)stageIds.take(toRemove).foreach { id => cleanStage(id) }stageIds.trimStart(toRemove)}
}
/** Clean metadata for old jobs if we have exceeded the number to retain. */
private def trimJobsIfNecessary(): Unit = {if (jobIds.size >= retainedJobs) {val toRemove = math.max(retainedJobs / 10, 1)jobIds.take(toRemove).foreach { id => cleanJob(id) }jobIds.trimStart(toRemove)}
}

找找 retainedJobs 和retainedStages 的配置是多少?

  // How many jobs or stages to retain graph metadata forprivate val retainedJobs =conf.getInt("spark.ui.retainedJobs", SparkUI.DEFAULT_RETAINED_JOBS)private val retainedStages =conf.getInt("spark.ui.retainedStages", SparkUI.DEFAULT_RETAINED_STAGES)val DEFAULT_RETAINED_STAGES = 1000val DEFAULT_RETAINED_JOBS = 1000
发现只有改spark.ui.retainedJobs和spark.ui.retainedStages参数,但改了木有用啊。。。崩溃。。。了。。。
最后一招:把源码改一下,在清理 stage那里增加log,看看

在这里插入图片描述
trimStagesIfNecessary()
trimJobsIfNecessary()
源码里面都打了 log去看, stage超过1000,不改这2个参数确实跑去删DAG, 改大发现没删DAG,但在页面也没看到DAG信息,气死 ,见鬼了

解决方案

spark-default.conf里面新增配置
spark.ui.timeline.tasks.maximum=100000

这篇关于spark ui job和stage的dag图查看过去运行的任务,查不到,分析源码解决问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642916

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例