背景
某局点上线新版本后,实时标注(spark streaming任务)运行一个小时后,任务卡死。
具体情况:实时数据量10w/s, 任务配置 executor 60个, 内存10g,到一个小时任务开始积压
定位过程
- 对比任务和之前版本的配置,变化不大,理论上不应该是配置导致积压
- 初步怀疑新加的字符串替换方法影响性能,经过构造数据测试发现非瓶颈
- 每次都到一个小时就开始积压,怀疑是full GC导致,gc日志显示spark确实每隔一段时间会人为调用System.gc,但是full GC的时间较短,仅为300ms左右
- 准备到executor节点打jstack,平时没多留意,yarn前台可以看到每个节点的thread dump(可以多次进入查看,搜索main或者com.xxx),较多executor节点线程出现在某个读取hdfs文件的方法(这部分代码为新增逻辑),这个方法刚好一个小时调度一次,由于executor较多,同时读取name node压力太大,导致瞬间卡顿,删除,一切正常了。