在数据仓库中,ODS 层数据一般来源于客户端的日志和业务数据库中的数据,对于 MYSQL 等关系型数据库,我们需要将库中数据同步到 Hive 中进行查询与分析。这里简单介绍两种同步的方法。
低性能同步法
- 直连 MySQL 并 select 表中数据
- 将 select 的结果存储到本地作为中间存储
- 将中间存储的文件 load 进 Hive 表中
这种方法实现起来比较简单,但也有较大的缺陷,主要有以下几点:
- 随着业务规模不断扩大,每次 select 得到的数据量不断加大,将结果存本地再 load 进 Hive 这种方式会造成性能问题,无法满足下游数仓生产的时效性要求
- 从 MySQL 中 select 大量数据,会对 MySQL 造成过大压力,可能会影响线上服务
- Hive 无法有效支持 MySQL 中的 update、delete 操作
为了解决上述问题,大多数互联网公司都采用了实时Binlog采集 + 离线处理Binlog还原业务数据的方案,由于Binlog是流式产生的,因此将数据处理需求由每天同步一次均摊到实时流中,减小了对MySQL的访问压力,减小了对线上性能可能造成的影响。另外,因为Binlog是MySQL的二进制日志,其记录了MySQL中发生的所有数据变更,因此也能够记录数据的 insert、update、delete操作,通过一些语义方面的处理,能做到数据的精准还原。
利用 MySQL Binlog 的同步法
这一部分仅介绍大致思路