大家好,我是负雪明烛,一个热爱分享的程序员。
我们有一个 Spark 任务,一直运行的很稳定。
前两天有个需求,要在这个任务里面加一个字段。按理来说,这个需求很简单,几分钟就能搞定。
但是在测试过程中,试了很多次都执行失败了。
错误原因有两个:
一部分 executor 出现了 OOM
一部分 executor 报了空指针 NPE 错误
因为 NPE 错误有完整的错误栈,可以看到是与数据填充有关的错误,所以我就一直盯着这个数据填充问题去排查了,比如有没有数据是 NULL 值。
按照这个思路排查了很久也没发现什么问题,而且线上任务已经执行了很久了都问题啊。。
上网搜资料、咨询大模型这个 NPE 错误怎么回事,也没有靠谱回答。
所以我就觉得很神奇,开始怀疑人生。
后来,跟同事交流的时候,他说他遇到过这个问题。
这个问题不复杂:executor 内存不够(线上是大内存,测试的时候选择了小内存),同时引发了 OOM 问题和 NPE 错误。
我把 OOM 问题忽略了,去了错误的排查方向,所以怎么也解决不了。
果然加了内存以后,作业测试通过就可以上线了。
通过这个排查经过,我发现自己在排查问题的时候倾向于优先解决“看起来”更显而易见的问题。
如果多个错误直接没有关联关系,这么做可以逐步逼近真相。
但是,如果多个错误本质上是一个错误的时候,那么就可能走偏,陷入到局部解里面。
下次再遇到这种多个错误同时出现的情况,不妨想想它们是不是同一个原因导致的,或许解决起来更容易。
这是我通过一个 Bug 的反思,希望对大家有些帮助。
欢迎加我微信交流:
还有很多所见所闻想要分享,下期见!
关注我,大量干货内容,投递给您↓
我是「负雪明烛」,互联网大厂在职程序员,一个计算机知识分享者。
关注我,你可以获得优质算法题解、求职技巧、大厂内推、工作经验。
欢迎点击关注+星标⭐️!