时间:2024-02-08 11:17作者:下载吧人气:38
好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备、组建、招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇。
进入主题,通常企业为了实现数据统计、数据分析、数据挖掘、解决信息孤岛等全局数据的系统化运作管理 ,为BI、经营分析、决策支持系统等深度开发应用奠定基础,挖掘数据价值 ,企业会开始着手建立数据仓库,数据中台。而这些数据来源则来自于企业的各个业务系统的数据或爬取外部的数据,从业务系统数据到数据仓库的过程就是一个ETL(Extract-Transform-Load)行为,包括了采集、清洗、数据转换等主要过程,通常异构数据抽取转换使用Sqoop、DataX等,日志采集Flume、Logstash、Filebeat等。
数据抽取分为全量抽取和增量抽取,全量抽取类似于数据迁移或数据复制,全量抽取很好理解;增量抽取在全量的基础上做增量,只监听、捕捉动态变化的数据。如何捕捉数据的变化是增量抽取的关键,一是准确性,必须保证准确的捕捉到数据的动态变化,二是性能,不能对业务系统造成太大的压力。
通常增量抽取有几种方式,各有优缺点。
在源数据库上的目标表创建触发器,监听增、删、改操作,捕捉到数据的变更写入临时表。
优点:操作简单、规则清晰,对源表不影响;
缺点:对源数据库有侵入,对业务系统有一定的影响;
在ETL过程中,抽取方建立临时表待全量抽取存储,然后在进行比对数据。
优点:对源数据库、源表都无需改动,完全交付ETL过程处理,统一管理;
缺点:ETL效率低、设计复杂,数据量越大,速度越慢,时效性不确定;
在抽取数据之前,先将表中数据清空,然后全量抽取。
优点:ETL 操作简单,速度快。
缺点:全量抽取一般采取T+1的形式,抽取数据量大的表容易对数据库造成压力;
时间戳的方式即在源表上增加时间戳列,对发生变更的表进行更新,然后根据时间戳进行提取。
优点:操作简单,ELT逻辑清晰,性能比较好;
缺点:对业务系统有侵入,数据库表也需要额外增加字段。对于老的业务系统可能不容易做变更。
变更数据捕获Change Data Capture(简称CDC),SQLServer为实时更新数据同步提供了CDC机制,类似于Mysql的binlog,将数据更新操作维护到一张CDC表中。开启CDC的源表在插入INSERT、更新UPDATE和删除DELETE活动时会插入数据到日志表中。cdc通过捕获进程将变更数据捕获到变更表中,通过cdc提供的查询函数,可以捕获这部分数据。详情可以查看官方介绍:关于变更数据捕获 (SQL Server)
优点:提供易于使用的API 来设置CDC 环境,缩短ETL 的时间,无需修改业务系统表结构。
缺点:受数据库版本的限制,实现过程相对复杂。
1. 已搭建好Kafka集群,Zookeeper集群;
2. 源数据库支持CDC,版本采用开发版或企业版。
案例环境:
Ubuntu 20.04
Kafka2.13-2.7.0
Zookeeper 3.6.2
SQL Server 2012
除了数据库开启CDC支持以外,主要还是要将变更的数据通过Kafka Connect传输数据,Debezium是目前官方推荐的连接器,它支持绝大多数主流数据库:MySQL、PostgreSQL、SQL Server、Oracle等等,详情查看Connectors。
开启数据库CDC支持
在源数据库执行以下命令:
EXEC sys.sp_cdc_enable_db GO
附上关闭语句:
exec sys.sp_cdc_disable_db
查询是否启用
select * from sys.databases where is_cdc_enabled = 1
网友评论