在现代企业中,离线仓库扮演着不可或缺的角色。它充当着一个数据的中心枢纽,存储和管理着海量的信息。作为企业数据分析、业务决策和预测的基石,离线仓库的重要性不言而喻。
而数据的实时性和准确性对于确保数据仓库的有效性至关重要。而离线数仓中常见的数据同步方式是T+1,其中同步方式主要分为两种:全量同步和增量同步。
本文聚焦于探讨增量同步的原理,解析其工作机制和实现方法。
在大数据平台中,业务部门常常需要查看历史某一天的表数据。为了记录历史数据的变化,常见的解决方案包括拉链表和快照表。然而,由于拉链表的实现方式和查询方式较为复杂不便直观的展现问题,因此在这里我选择使用快照表作为示例,以便更清晰地阐述离线数仓的数据一致性问题。
快照表是用来存储某个时间点的所有数据-通常粒度是天,相当于是对每天的业务数据做了一次快照,存储当天的全量数据;例如:快照表12号分区中的数据是从历史到11号的所有数据,13号分区中的数据是从历史到12号的所有数据,其他的以此类推,示例如下:
id | name | phone | gender | create_time | update_time |
---|---|---|---|---|---|
1 | jack | 111 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 |
2 | jason | 222 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 |
3 | tom | 333 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 |
id | name | phone | gender | create_time | update_time | dt[分区字段] |
---|---|---|---|---|---|---|
1 | jack | 111 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
2 | jason | 222 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
3 | tom | 333 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
加粗为分区字段
id | name | phone | gender | create_time | update_time |
---|---|---|---|---|---|
1 | jack | 111 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 |
2 | jason | 222 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 |
3 | tom | 444 | 男 | 2023-06-01 13:00:00 | 2023-06-02 09:00:00 |
4 | tony | 555 | 男 | 2023-06-02 10:00:00 | 2023-06-02 10:00:00 |
加粗为更新/新增数据
id | name | phone | gender | create_time | update_time | dt[分区字段] |
---|---|---|---|---|---|---|
1 | jack | 111 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
2 | jason | 222 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
3 | tom | 333 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-01 |
1 | jack | 111 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-02 |
2 | jason | 222 | 男 | 2023-06-01 13:00:00 | 2023-06-01 13:00:00 | 2023-06-02 |
3 | tom | 444 | 男 | 2023-06-01 13:00:00 | 2023-06-02 09:00:00 | 2023-06-02 |
4 | tony | 555 | 男 | 2023-06-02 10:00:00 | 2023-06-02 10:00:00 | 2023-06-02 |
加粗为更新/新增数据
以上是快照表的表现形式,具体实现方式如下
全量同步顾名思义是将业务数据用户表全量同步一份到数仓快照表中的指定分区内,该方式简单粗暴,这里以:2.1、示例中的 2023-06-02业务数据新增了一名用户,且更改了tom的手机号为例;过程如下:
# 2023-06-03凌晨执行的全量同步sql语句
INSERT INTO 数仓快照表 PARTITION (date='2023-06-02')
select * from 业务用户表 where update_time < '2023-06-03 00:00:00';
增量同步顾名思义是将业务数据用户表按天为粒度将增量数据与数仓快照表中的前一天数据进行join对比后放入到指定分区内,该方式需要业务数据有唯一字段(常用ID) 和 update_time时间戳,否则无法使用增量同步,这里以:2.1、中示例,实现原理如下:
-- 通过以下sql提取出业务表中的增量数据
select * from 业务用户表 where
update_time >= '2023-06-02 00:00:00' and update_time < '2023-06-03 00:00:00';
-- 通过与数仓2023-06-01分区数据进行left join 及判空提取出未更改的数据后再与增量数据union结合得到最新数据
SELECT 数仓快照表.*
FROM `数仓快照表` LEFT JOIN 增量数据表 ON 数仓快照表.id = 增量数据表 .id
WHERE 增量数据表 .id IS NOT NULL
UNION
SELECT 增量数据表 .*
FROM `增量数据表 `
-- 将业务数据导入 至 数仓快照表2023-06-02目标分区中
INSERT INTO 数仓快照表 PARTITION (date='2023-06-02')
SELECT 数仓快照表.*
FROM `数仓快照表` LEFT JOIN 增量数据表 ON 数仓快照表.id = 增量数据表 .id
WHERE 增量数据表 .id IS NOT NULL
UNION
SELECT 增量数据表 .*
FROM `增量数据表 `
增量同步方式是一种数据同步的方式,其优势在于只提取业务数据中发生变化的部分,即增量数据集。相对于全量同步,这种方式能够带来诸多优势,其中包括以下几点:
综上所述,增量同步方式通过只同步业务数据中的变化部分,相比全量同步,能够有效降低对业务数据库的负荷,节省时间和资源,减少同步错误和冲突,以及提高同步效率和性能。这种方式是数据同步过程中常用的有效策略之一,有助于提升数据同步的效率和可靠性。