CC00056.hadoop——|Hadoop&Sqoop.V04|——|Sqoop.v04|增量数据导入|

本文介绍了变化数据捕获(CDC)的概念,包括侵入式和非侵入式方法,并详细阐述了四种常见的CDC策略:基于时间戳、触发器、快照和日志。此外,还探讨了 Sqoop 在增量数据导入中的应用,特别是基于递增列的Append方式,通过实例展示了如何从MySQL向Hive进行增量数据导入。
摘要由CSDN通过智能技术生成
一、增量数据导入
### --- 变化数据捕获(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值