Spark日志查看技巧

70 阅读2分钟

不要把日志等级设置为Error

客户端模式下,Driver的日志和用户自定义的打印混合在一起,有时为了便于观察用户自定义的打印结果,会通过spark.sparkContext.setLogLevel("ERROR") 把日志等级设置为ERROR。通常情况下这样设置不会影响对异常的定位,这种情况除外:task多次重试,失败的原因不一样。task失败信息的日志等级是Warn,只有最后一次task失败的原因会作为ERROR级别打印出来,这极有可能不是问题的根本原因。
比如:写数据库时,因为某个字段超长报错,重试之后的错误就会变成主键冲突。

快速定位异常

task级别异常定位

搜索Lost task


task级别的异常对于了解任务运行中遇到过的问题非常重要,但是由于spark的task重试机制,通过Lost task搜到的并不一定是导致失败的根本原因。比如:某个Executor因心跳超时或者内存溢出被杀掉,其上的task转移到新的executor正常运行,后面任务因为其他原因失败,那么搜到的心跳超时或者内存溢出就不是失败的根本原因。

任务终止异常定位

Driver日志的结尾会打印最后一次发生的异常。
cluster提交模式可以直接搜索:Final app status

client提交模式由于日志是单独的文件,不与Executor的日志混在一起,直接拉到末尾即可。
注意:这里找到的是任务最后一次发生的异常,不一定是导致任务失败的根本原因,参考不要把日志等级设置为Error

特殊情况

Driver中异常信息不详细

这种情况常见于算子中的数据库连接抛出的异常,因为客户端会对异常做处理,导致Driver端收集到的异常信息不够详细。这样就需要去Executor中的日志找,一般搜Caused by。

Driver日志未正常结束

这里指任务已经结束了,但是Driver日志仿佛被截断了一样。这种情况常见于Driver小内存、Executor数量大的情况,比如4G的Driver带着32个Executor,Driver由于内存不足直接被杀掉,Executor纷纷因连接不到Driver而Shutdown,一般调大Driver内存即可解决。