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