一、问题的来源
上周五,有业务人员反馈某个面板数据存在误差,经过核查后我发现了问题所在:A表数据缺失导致了面板数据逻辑的混乱。
A表是我上周新构建的一个数仓表,由于源数据的更新频率较低,我设置了每周更新两次,即在每周二和周五的凌晨0:10进行更新。
我重跑下该表的调度任务后,再刷新数据面板,发现数据恢复了正常。当时手头还有其他任务需要处理,因此没有详细研究问题的原因。
今天(周二)我需要使用该表时,却发现表单数据又是一片空白。当我再次重跑调度任务之后,便又获取到了数据。
这一现象引起了我的关注:在不执行调度任务时,数据表现正常;一旦执行调度任务,数据反而出现了问题?
二、探索解决方案
2.1 从日志出发探索
为了找到问题的根源,我先从运行日志入手。
在【Dataworks的运维中心】,找到该今天凌晨调度的实例,点击【展开详情】,查看相关的【运行日志】。(也可以直接点击【查看日志】)
通过观察运行日志,我发现了系统给了一个警告:我所读取的分区表,姑且叫 B 表,昨天的分区中没有数据。
WARNING:[0,0] table scan <table_name> with filter E0($7, $‘20221031’) was prouned to empty values。
这导致我读取不到数据,最终通过 insert overwrite table A表
将数据写入 A 表时,原有的数据都被清空,而新写入的数据为空,所以A表的数据记录数为0。
而 B 表是每天的分区表,以天为分区,每天会把前一天的所有数据都放到昨天的分区中。
理论上,B表不可能没有数据的,除非是任务挂掉了。但是项目任务并没有报错,故排除任务挂掉的原因。
2.2 从调度出发寻找答案
在数据地图查看B表数据的时候,突然开窍了!B表创建分区的时间是3点左右,那数据插入分区的时间会更晚,所以我凌晨执行调度任务的时候,B表还没有相关数据。
综上,所有的疑问现在都已经得到了解答!导致这个问题的本质原因就是调度时间的失误。因此,解决方案也呼之欲出,必须在确保B表存在数据后才能启动A表的调度。这意味着需要将A表的调度时间设置在B表创建分区并插入数据的时间之后,最后我将调度时间修改为早上8:10。
三、小结
在具体调整和部署整个工作流程时,我们务必了解源表的调度信息,充分理解源表的逻辑关系和运行机制,这样才能在最大程度上避免由于部分表单数据未被录入或丢失而导致的调度结果出现异常的现象,从而有力地保障数据信息的准确性、完整性和可靠性。