spark task过多导致任务运行过慢甚至超时

简介: spark task过多导致任务运行过慢甚至超时

背景以及现象


本文基于 spark 3.1.2

设置spark.driver.memory=2g

在调试spark sql任务的时候,发现有几个任务产生了40多万个Task,而且任务长期运行不出来。


分析


运行此sql,可以得到如下的dag(我们只截取产生Task多的Stage),由此可以看到是scan的文件太大了(scan了日志文件半年的数据)。

image.png

但是为什么这种情况下会导致任务运行很缓慢甚至会超时呢?

找到driver端,

用jstat -gcutil查看一下对应的gc情况(对应的内存都是调优完后的镜像信息),如下:

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 62.02   0.00   9.96  64.72  91.02  94.29    916   13.091    26    0.650   13.742
  0.00  77.27   6.58  64.72  91.02  94.29    917   13.100    26    0.650   13.750
  0.00  77.27  76.70  64.72  91.02  94.29    917   13.100    26    0.650   13.750
  0.00  22.28  45.52  65.65  91.02  94.29    921   13.143    26    0.650   13.794
  0.00  43.36  70.04  65.65  91.02  94.29    923   13.157    26    0.650   13.807
 63.00   0.00  71.39  65.65  91.02  94.29    924   13.165    26    0.650   13.815
  0.00  87.35  42.71  65.65  91.02  94.29    925   13.173    26    0.650   13.823
 21.96   0.00   0.00  66.59  91.02  94.29    930   13.220    26    0.650   13.871
 62.19   0.00   7.41  66.59  91.02  94.29    932   13.235    26    0.650   13.886
 62.19   0.00  65.55  66.59  91.02  94.29    932   13.235    26    0.650   13.886

直接用jmap -heap 命令查看一下对应的堆情况:

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 172621824 (164.625MB)
   MaxNewSize               = 523436032 (499.1875MB)
   OldSize                  = 345374720 (329.375MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 155385856 (148.1875MB)
   used     = 115967072 (110.59481811523438MB)
   free     = 39418784 (37.592681884765625MB)
   74.63167818826444% used
Eden Space:
   capacity = 138149888 (131.75MB)
   used     = 100616000 (95.95489501953125MB)
   free     = 37533888 (35.79510498046875MB)
   72.83103986302181% used
From Space:
   capacity = 17235968 (16.4375MB)
   used     = 15351072 (14.639923095703125MB)
   free     = 1884896 (1.797576904296875MB)
   89.06417092442966% used
To Space:
   capacity = 17235968 (16.4375MB)
   used     = 0 (0.0MB)
   free     = 17235968 (16.4375MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 3127533568 (2982.6484375MB)
   used     = 2325934584 (2218.1840744018555MB)
   free     = 801598984 (764.4643630981445MB)
   74.36961213776492% used

可以看到driver端的内存 full gc频次有点高,而且内存增长的很厉害。

再次 我们用jmap -dump:format=b,file=heapdump.hprof命令dump内存的堆信息,我们分析一下,用MAT打开,我们可以看到如下的信息:

image.png

image.png

可以看到 taskSetManager的内就占用了700M。而且这任务才只是开始运行,所以后续很长一段时间,必然会占比较长的时间段。

而且这只是一个taskSetManager的内存占用,如果在足够复杂的sql下,有可能会有类似的taskSetManaget会有多个(taskSetManager是一个stage所有task的总和)。


结论以及解决方法


所以在这种情况下,如果业务上改变不了,我们就得增加内存,在笔者的情况下,增加driver内存到4g就能很好的解决,且运行的速度很快。

spark.driver.memory=4g
相关文章
|
10天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
73 4
|
7月前
|
SQL 分布式计算 资源调度
Dataphin功能Tips系列(48)-如何根据Hive SQL/Spark SQL的任务优先级指定YARN资源队列
如何根据Hive SQL/Spark SQL的任务优先级指定YARN资源队列
242 4
|
7月前
|
分布式计算 监控 Java
|
8月前
|
分布式计算 Spark
【赵渝强老师】Spark RDD的依赖关系和任务阶段
Spark RDD之间的依赖关系分为窄依赖和宽依赖。窄依赖指父RDD的每个分区最多被一个子RDD分区使用,如map、filter操作;宽依赖则指父RDD的每个分区被多个子RDD分区使用,如分组和某些join操作。窄依赖任务可在同一阶段完成,而宽依赖因Shuffle的存在需划分不同阶段执行。借助Spark Web Console可查看任务的DAG图及阶段划分。
334 15
|
9月前
|
存储 分布式计算 调度
Spark Master HA 主从切换过程不会影响到集群已有作业的运行, 为什么?
Spark Master 的高可用性(HA)机制确保主节点故障时,备用主节点能无缝接管集群管理,保障稳定运行。关键在于: 1. **Driver 和 Executor 独立**:任务执行不依赖 Master。 2. **应用状态保持**:备用 Master 通过 ZooKeeper 恢复集群状态。 3. **ZooKeeper 协调**:快速选举新 Master 并同步状态。 4. **容错机制**:任务可在其他 Executor 上重新调度。 这些特性保证了集群在 Master 故障时仍能正常运行。
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
211 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
4月前
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
237 0
|
7月前
|
存储 分布式计算 Hadoop
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
312 79
|
11月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
736 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
207 0