都说互联网公司快,在大数据开发领域也是如此,数据仓库的各ETL任务每天都有更新,而源头的数据也是在不断变化,需要保证快速更变的同时,保证系统稳定。
上一篇 Hive表数据质量校验的设计与开发 描述了离线计算任务运行结束后的校验方法,算是事后校验,本篇将描述事前校验。姑且把这一类事前叫做持续集成,就像是Jenkins每天定时构建、执行单元测试一样,离线计算任务也是定时的检查。
数据源DB级连通性校验
我们公司有几百个MySQL库,偶尔会出现数据库地址变更、老库下线、主从切换、权限异常等情况,DBA并不能感知到对离线ETL任务的影响,这种变更可能导致离线ETL任务异常。
为此,我们做了DB级的连通性校验,取到系统里所有的数据库连接,每小时去测试这些连接是否有效,及时发现异常连接,清理无效连接。
自动化数据同步集成测试
数据源的MySQL表经常会做表结构变更,其中删表、字段类型修改、减字段可能引起离线ETL任务失败。
为了达到检查上述异常的目的,我们在每天晚上9点之后,会把前一天的数据同步任务“回放”,这个回放有两处变化
- 只同步一条数据
- 把数据写到测试目录
SQL静态检查
和MySQL表类似,Hive的删表、字段变更可能会引起下游任务异常,除了在编辑SQL的时候给出实时的静态检查建议,我们也还做了每天多个时段的全局SQL静态检查。
在SQL前加上explain关键字,然后提交到Hive执行,可以检测到SQL语法异常,顺便可以知道一条SQL的输入表和产出表,得到血缘关系。提交到Hive执行有点慢,SQL解析的结果也比较简单,如果有更多要求的,也可以使用antlr来解析。
自动化关键SQL的集成测试
一方面计算引擎自身可能有bug,或因为升级或配置出现问题,另一方面核心SQL的正确性也需要保证完全正确无误,我们同样会把一些核心SQL在晚上执行一次。准备测试的数据集,执行SQL,然后把实际结果和预期结果对比。
变更的影响分析
严格讲这算是一种监控,当一张MySQL或Hive表发生变更,根据血缘关系,把相关变更通知到下游任务的责任人
UDF的持续集成
UDF是一系列Java工程,这些Java工程都会接入Jenkins,做真正意义上的持续集成,确保通过maven构建以及执行单元测试没有问题
小结
通过以上措施,偶尔能发现异常问题,而每次发现和解决问题,至少避免了一次凌晨起夜处理问题,提升生活质量,也提升了数据仓库的稳定性