本文为您介绍数据正确性有关的常见问题。
为什么作业没有输出?
场景描述
上线运行作业后,下游结果表中没有数据。
排错流程图
检查作业中是否存在Failover
排错指引
查看Failover报错信息,分析作业运行异常原因。
解决方案
解决Failover问题,使作业正常运行。
检查源表数据是否进入实时计算Flink版
排错指引
这种情况下没有Failover,但数据延时会很大,请查看监控告警页面numRecordsInOfSource,检查各Source输入是否有数据。
解决方案
检查源表,保证上游有数据进入实时计算Flink版。
检查数据是否被某个节点过滤
在其他配置中添加pipeline.operator-chaining: 'false' ,具体操作请参见如何配置作业运行参数?。将节点拆分,然后观察每个节点的Bytes Received(输入)和Bytes Sent(输出),确定数据在哪个节点被过滤,如果某个节点输出为0,输入不为0,说明数据被这个节点过滤了。常见的导致数据无输出的算子包括join、window或where。
检查下游是否由于默认缓存机制缓存了数据
解决方案:排除作业的业务逻辑异常后,调整下游存储的batchsize的大小。
重要如果batchsize参数设置的过小,则可能会造成下游数据库I/O压力过大、存在性能瓶颈的风险。例如,如果将batchsize设置为1,说明处理完一条数据,就会请求一次数据库,大数据场景下会导致数据库压力大。
检查下游RDS,是否存在死锁
您可以使用print结果表,将计算结果打印到日志中,对日志进行分析,判断无输出结果的原因。详情请参见如何在控制台查看print数据结果?
开启minibatch,table.exec.state.ttl过期后,为什么无新数据更新?
该行为是产品底层默认行为,即只要State TTL过期了,后续的计算即使输出了,结果也是有问题的。详情如下:
开启minibatch: 如果State过期被淘汰,后边相同的key有新数据进来,也不会触发update输出。
未开启minibatch:如果State过期被淘汰,update_before会忽略,update_after会处理并输出第一个更新,但State是从初始开始计算,所以结果也是有问题的。