2023年11月28日发(作者:)
如何查看Spark⽇志与排查报错问题
⼀、各界⾯说明
1.1、查看YARN页⾯的driver⽇志
可以在右侧搜索框中填对应application号找到任务,然后点击对应的application号链接,如下图所⽰:
这样会进⼊该application的信息界⾯,“FinalStatus”显⽰了该application的最后状态,点击下⽅的“logs”按钮也会进⼊到driver⽇志
界⾯,如下图所⽰:
对于driver⽇志⽽⾔,代码中的println()和show()等函数的输出,⼀般都在stdout⾥,⼤部分重要的报错信息都在stderr⾥。如果
application跑的很慢,还可以通过gclog确认是否是因为driver遇到了Full GC,也可以进⼊stdout或stderr⽇志界⾯后,在浏览器地址栏
中将“stdout”或“stderr”⽂字替换为“gclog”,回车后也可查看gclog信息。
在stdout与stderr中,着重搜索和看ERROR、Exception、Failed、Caused by等位置的报错信息,这四个位置都没什么内容再看
(1)⾸先是“Jobs”界⾯,“Event Timeline”⼀栏可以显⽰各Executor的加⼊与回收;“Active Jobs”⼀栏指正在运⾏或等待运⾏的
各stage的“Description”处有蓝⾊链接,可以点击进⼊该stage的详细信息界⾯,开头提到了该stage的总执⾏时长、本地化级别情况、
当然该metric表格显⽰是存在⼩⽂件和数据倾斜情况的,后⾯会详细提到。下⾯⽐较重要的是Tasks表格,记录了该stage每⼀个task的执
在Node Manager⽇志列表中,每⼩时都对应⼀个链接,点击任务出问题的那个⼩时的链接进去,搜索对应container号查找关于该
可以看到该query中读写了三个Hive表且显⽰了读到的数据量,其中两个表进⾏了shuffle和SortMergJoin,⿏标移动到对应蓝⾊节点还会
(7)如果是Streaming实时任务,还会多出来⼀个“Streaming”菜单,可以查看各微批次(batch)的延迟等情况,⼀般常常会
看“Scheduling Delay”,这⼀列如果⼤多是0ms到2ms左右,说明各批次处理没有明显的延迟,如果ms数较⼤则可能需要关注前⾯批
次的调度延迟情况,如下图所⽰:
可以看到在“Shuffle Read Size”或“Input Size”那⼀栏中,各task读取数据量的最⼩值、中位数、最⼤值等并不均匀,如果是更加极
如果的确遇到了数据倾斜,可参考上⾯博客链接的第11点解决。如果⾃⼰集群的Spark版本在3.0以上,或者内部2.x版本合⼊了Intel的
Adaptive Execution特性源码,并且确定造成数据倾斜的代码位置有join操作,则可以加上如下参数缓解:
--针对SQL任务
set d=true;
set d=true;
//针对代码任务
--conf d=true
另⼀种判断标准是“Stages”菜单中,某个stage的进度蓝条上task数太多达到好⼏万的级别,⽤Input或Shuffle Read量除以task数后,
每个task处理的数据量远⼩于128或256M,如下图所⽰:
有时⼩⽂件多造成的task数过多,会导致driver full gc从⽽导致Spark UI⽹页打不开从⽽看不到Stages情况,因为driver内存有限且负责
spark ui的metrics信息状态维护,如下图所⽰:
在遇到⼩⽂件时,如果⾃⼰集群的Spark版本在3.0以上,或者内部2.x版本合⼊了Intel的Adaptive Execution特性源码,可以加上下⾯的
参数来缓解:
insert overwrite table tableName
select /*+ REPARTITION(1000) */ age,count(*)
from person where age between 10 and 20 group by age
⼩⽂件过多也可能导致内存溢出,因为⽤于读取每⼀个⽂件的reader对象,Spark都会在内存中⽣成⼀个1M⼤⼩的缓冲区,下⾯截图来⾃
《SparkSQL内核剖析》:
2.4、内存溢出(OOM)
如果数据量很⼤、数据倾斜、并发度不合理、代码逻辑不合理等原因,导致Driver或者Executor的内存不够,就会出现下图所⽰的OOM错
误:
⾸先要确认是Driver还是Executor端OOM,也就是OOM的报错内容是在哪个节点的stdout或stderr看到的,那就是哪个节点OOM。如果
遇到了可以参考第⼆章开头的博客链接第12点来解决。
如果是driver端OOM或内存压⼒⼤,还有⼀个判断⽅法是Spark UI页⾯打开⼗分缓慢,因为代码的解析、相关对象的序列化、⼴播变量、
如果⾃⼰队列显⽰为黄⾊、或已使⽤的资源中,内存或CPU核数其中⼀项已经达到最⼩资源阈值(Min Resource)、或最⼩资源⾮常⼩,
第三种迹象,如果spark ui的job或stages界⾯中,正在运⾏的job或stage只有少数task在长时间running,并且进⼊该stage的
发布评论