线上操作须谨慎!!!记录一次有关动态分区导致的bug
问题描述
记录一次线上bug。bug引起的原因很简单,就是对数仓门店维表新增字段的时候,把新增字段放在最后面,因为我们采取的是动态分区的方式,默认以最后一个字段作为分区字段,程序在第二天执行的时候使本来分区的数据存在了脏分区内。正常分区没有数据,关键是程序正常执行,并没有触发报警机制。所以悲剧就这样酿成了。。。。导致相关下游,包括报表,模型,算法,以及维度相关的应用大批量的空数据或者直接报错。
问题复盘
至于后期怎么处理的,无非是重跑分区,下游任务做重跑,只是影响已经产生了。此次我们关键讲下怎么在程序方面预防这个问题:
- 首先我们这边开发个任务,给关键任务配置下游依赖,判断该关键任务产生的表的当前分区是否有数据。
- 将目前部分任务由动态分区改为静态分区,这样无须考虑分区字段的位置,降低出错的可能,同时限制小分区的个数改为distribute by cast(rand() * 1 as int)。
- 针对动态分区的任务,overwrite前写加一层统一逻辑判断,判断动态分区字段是否在表的最后一列。