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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud