ODPS只保证at least once,不保证exactly once。只不过使用batch tunnel时出现重复数据的概率比使用streaming tunnel时小很多。
首先检查是否使用了streaming tunnel(odps 表 with 参数里是否有 'useStreamTunnel' = 'true')。
如果是,在作业出现任意failover的情况下ODPS里确实会出现重复数据,是期望行为。
如果使用batch tunnel(odps 表 with 参数里没有 'useStreamTunnel'),那么只有在做checkpoint出现failover时,ODPS里才有可能出现重复数据(表现为一部分partition有重复数据,一部分没有),也是期望行为。
如果作业运行正常没有failover但仍然有重复数据,建议检查代码逻辑,以及是否有其他作业在写同样的ODPS表。