点击关注“有赞coder”
获取更多技术干货哦~
两边都跑:任务在新老环境都进行调度
老环境跑:任务只在老环境进行调度
新环境跑:任务只在新环境进行调度
导入任务 (MySQL -> Hive):通常是双跑,也就是两个集群在调度期间都会从业务方的 MySQL 拉取数据(由于拉取的是 Slave 库,且全量拉取的一般是数据量不太大的表)
Hive、SparkSQL 任务:通常也是双跑,双跑时新老集群都会进行计算。
MapReduce、Spark Jar 任务:需要业务方自行判断:任务的输出是否是幂等的、代码中是否配置了指向老集群的地址信息等
导出任务:一般而言无法双跑,如果两个环境的任务同时向同一个 MySQL表(或者 同一个ElasticSearch 索引)写入/更新数据,容易造成数据不一致,建议在验证了上游 Hive 表数据在两个集群一致性后进行切换(只在新环境跑)。
同时处于用户容易误操作导致问题的考虑,DP 平台在用户设置任务运行方式后,进行必要的规则校验:
如果任务状态是双跑,则任务依赖的上游必须处于双跑的状态,否则进行报错。
如果任务是第一次双跑,会使用 Distcp 将其产出的 Hive 表同步到新集群,基于 Distcp 本身的特性,实际上只同步了在第一次同步之后的增量/修改数据。
图 3.5 DP 任务双跑期间数据流向
图 3.6 Hive表新老集群数据一致性校验方案