|NO.Z.00056|——————————|BigDataEnd|——|Hadoop&Sqoop.V04|——|Sqoop.v04|增量数据导入|
一、增量数据导入
### --- 变化数据捕获(CDC)
~~~ 前面都是执行的全量数据导入。如果数据量很小,则采取完全源数据抽取;如果源数据量很大,
~~~ 则需要抽取发生变化的数据,这种数据抽取模式叫做变化数据捕获,简称CDC(Change Data Capture)。
### --- CDC大体分为两种:
~~~ 侵入式和非侵入式。侵入式指CDC操作会给源系统带来性能影响,
~~~ 只要CDC操作以任何一种方式对源数据库执行了SQL操作,就认为是侵入式的。
二、常用的4种CDC方法是(前三种是侵入式的):
### --- 基于时间戳的CDC。
~~~ 抽取过程可以根据某些属性列来判断哪些数据是增量的,最常见的属性列有以下两种:
~~~ # 时间戳:
~~~ 最好有两个列,一个插入时间戳,表示何时创建,一个更新时间戳,表示最后一次更新的时间;
~~~ # 序列:
~~~ 大多数数据库都提供自增功能,表中的列定义成自增的,很容易地根据该列识别新插入的数据;
### --- 时间戳的CDC是最简单且常用的,但是有如下缺点:
~~~ 不能记录删除记录的操作
~~~ 无法识别多次更新
~~~ 不具有实时能力
### --- 基于触发器的CDC。
~~~ 当执行INSERT、UPDATE、DELETE这些SQL语句时,激活数据库里的触发器,
~~~ 使用触发器可捕获变更的数据,并把数据保存在中间临时表里。
~~~ 然后这些变更数据再从临时表取出。大多数场合下,
~~~ 不允许向操作型数据库里添加触发器,且这种方法会降低系统性能,基本不会被采用;
### --- 基于快照的CDC。
~~~ 可以通过比较源表和快照表来获得数据变化。
~~~ 基于快照的CDC可以检测到插入、更新和删除的数据,这是相对于基于时间戳的CDC方案的优点。
~~~ 其缺点是需要大量存储空间来保存快照;
### --- 基于日志的CDC。
~~~ 最复杂的和没有侵入性的CDC方法是基于日志的方式。
~~~ 数据库会把每个插入、更新、删除操作记录到日志里。
~~~ 解析日志文件,就可以获取相关信息。每个关系型数据库日志格式不一致,
~~~ 没有通用的产品。阿里巴巴的canal可以完成MySQL日志文件解析。
二、增量导入数据分为两种方式:
### --- 增量导入数据分为两种方式:
~~~ 基于递增列的增量数据导入(Append方式)
~~~ 基于时间列的数据增量导入(LastModified方式)
三、Append方式
### --- 准备初始数据
~~~ # 删除 MySQL 表中的全部数据
mysql> truncate table sqoop.goodtbl;
~~~ # 删除 Hive 表中的全部数据
hive (mydb)> truncate table mydb.goodtbl;
~~~ # 向MySQL的表中插入100条数据
call batchInsertTestData(1, 100);
~~~ # 查询插入的数据
mysql> select * from goodtbl;
### --- 将数据导入Hive
[root@linux123 ~]# sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--hive-table mydb.goodtbl \
--incremental append \
--check-column serialNumber \
--last-value 0 \
-m 1 \
--input-fields-terminated-by "\t"
~~~输出参数
INFO tool.ImportTool: --incremental append
INFO tool.ImportTool: --check-column serialNumber
INFO tool.ImportTool: --last-value 100
### --- 查看导入后数据
~~~ # 查看hive中导入了多少条数据
hive (mydb)> select count(*) from goodtbl;
100
### --- 参数说明:
~~~ check-column 用来指定一些列(即可以指定多个列),
~~~ 这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,
~~~ 和关系型数据库中的自增字段及时间戳类似。
~~~ 这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都不可以
~~~ last-value 指定上一次导入中检查列指定字段最大值
### --- 检查hive表中是否有数据,有多少条数据
### --- 再向MySQL中加入1000条数据,编号从200开始
~~~ # 插入数据
mysql> call batchInsertTestData(200, 1000);
~~~ # 查看数据
mysql> select count(*) from goodtbl;
+----------+
| count(*) |
+----------+
| 1100 |
+----------+
### --- 再次执行增量导入,将数据从 MySQL 导入 Hive 中;此时要将 last-value 改为
[root@linux123 ~]# sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--hive-table mydb.goodtbl \
--incremental append \
--check-column serialNumber \
--last-value 100 \
-m 1 \
--input-fields-terminated-by "\t"
~~输出参数
INFO tool.ImportTool: --incremental append
INFO tool.ImportTool: --check-column serialNumber
INFO tool.ImportTool: --last-value 1199
### --- 再检查hive表中是否有数据,有多少条数据
~~~ # 查看hive中导入了多少条数据
hive (mydb)> select count(*) from goodtbl;
1100
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」