详细描述
2015-12-18日提交测试,发现spark streaming job数据进入条数与输出的条数不一致:
发200条数据,streaming job 接收200,处理后输出250。
问题分析
排查了job代码,以及数据输出逻辑,均无发现问题。在查看job执行情况时发现一个很奇怪的task状态,见下图:
发现index-0的task产生了 speculative状态的task,因此猜测 spark 全局默认配置发生了修改,于是查看spark-defaults.conf配置,发现speculation的配置被修改:
spark.speculation true
该参数会自动判断运行速度相对较慢的task,并re-launch此task,导致一批数据有两个task存在,从而输出的数据也是task*2。
举例
spark streaming job接收到100条数据,数据partition为2,因此job生成两个task处理数据,数据被均分到两个partition中,
part-0:50 -> launch task-0 -> output to topic_tmp part-0
part-1:50 -> launch task-1 -> output to topic_tmp part-1