问题背景
作业流程是从hive读取数据处理后写入es,一直跑的很正常,突然今天发现部分数据重复了
问题排查
- 由于是长期正常运行的作业未发生变更,且排查了上游hive表不存在数据重复问题,首先排除了数据和逻辑问题
- spark作业是运行成功的,不存在作业失败重试的问题
- 推测是spark作业内部存在失败重试的问题,于是查看了spark history job的 timeline看到下面这个图表,可以确认是由于11、13节点在写入部分数据后失败了,yarn启动了21、22重新执行导致11、13写入的数据又写了一次
问题原因
导致问题出现的原因有两个,一个是spark2本身shuffle不稳定,且作业运行在任务高峰时段,集群资源紧张,导致节点运行失败。另一个是作业本身没有做数据级幂等,需要对重复写入的数据去重。
问题解决
1.做数据级幂等,针对es 的index写入增加配置 .option("es.write.operation", "upsert").option("es.mapping.id", "id")
2.将spark作业执行升级到更稳定的spark3