数据正确性

本文为您介绍数据正确性有关的常见问题。

为什么作业没有输出?

  • 场景描述

    上线运行作业后,下游结果表中没有数据。

  • 排错流程图作业排错流程图

    1. 检查作业中是否存在Failover

      • 排错指引

        查看Failover报错信息,分析作业运行异常原因。

      • 解决方案

        解决Failover问题,使作业正常运行。

    2. 检查源表数据是否进入实时计算Flink版

      • 排错指引

        这种情况下没有Failover,但数据延时会很大,请查看监控告警页面numRecordsInOfSource,检查各Source输入是否有数据。

      • 解决方案

        检查源表,保证上游有数据进入实时计算Flink版。

    3. 检查数据是否被某个节点过滤

      其他配置中添加pipeline.operator-chaining: 'false' ,具体操作请参见如何配置作业运行参数?。将节点拆分,然后观察每个节点的Bytes Received(输入)和Bytes Sent(输出),确定数据在哪个节点被过滤,如果某个节点输出为0,输入不为0,说明数据被这个节点过滤了。常见的导致数据无输出的算子包括join、window或where。

    4. 检查下游是否由于默认缓存机制缓存了数据

      解决方案:排除作业的业务逻辑异常后,调整下游存储的batchsize的大小。

      重要

      如果batchsize参数设置的过小,则可能会造成下游数据库I/O压力过大、存在性能瓶颈的风险。例如,如果将batchsize设置为1,说明处理完一条数据,就会请求一次数据库,大数据场景下会导致数据库压力大。

    5. 检查下游RDS,是否存在死锁

      解决方案:请参见写MySQL(TDDL/RDS)时,出现死锁(DeadLock)。

说明

您可以使用print结果表,将计算结果打印到日志中,对日志进行分析,判断无输出结果的原因。详情请参见如何在控制台查看print数据结果?

开启minibatch,table.exec.state.ttl过期后,为什么无新数据更新?

该行为是产品底层默认行为,即只要State TTL过期了,后续的计算即使输出了,结果也是有问题的。详情如下:

  • 开启minibatch: 如果State过期被淘汰,后边相同的key有新数据进来,也不会触发update输出。

  • 未开启minibatch:如果State过期被淘汰,update_before会忽略,update_after会处理并输出第一个更新,但State是从初始开始计算,所以结果也是有问题的。