|NO.Z.00056|——————————|BigDataEnd|——|Hadoop&Sqoop.V04|——|Sqoop.v04|增量数据导入|

一、增量数据导入
### --- 变化数据捕获(CDC)
~~~     前面都是执行的全量数据导入。如果数据量很小,则采取完全源数据抽取;如果源数据量很大,
~~~     则需要抽取发生变化的数据,这种数据抽取模式叫做变化数据捕获,简称CDC(Change Data Capture)。

### --- CDC大体分为两种:
~~~     侵入式和非侵入式。侵入式指CDC操作会给源系统带来性能影响,
~~~     只要CDC操作以任何一种方式对源数据库执行了SQL操作,就认为是侵入式的。
二、常用的4种CDC方法是(前三种是侵入式的):
### --- 基于时间戳的CDC。
~~~     抽取过程可以根据某些属性列来判断哪些数据是增量的,最常见的属性列有以下两种:

~~~     # 时间戳:
~~~     最好有两个列,一个插入时间戳,表示何时创建,一个更新时间戳,表示最后一次更新的时间;
~~~     # 序列:
~~~     大多数数据库都提供自增功能,表中的列定义成自增的,很容易地根据该列识别新插入的数据;
### --- 时间戳的CDC是最简单且常用的,但是有如下缺点:

~~~     不能记录删除记录的操作
~~~     无法识别多次更新
~~~     不具有实时能力
### --- 基于触发器的CDC。

~~~     当执行INSERTUPDATEDELETE这些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 用来指定一些列(即可以指定多个列),
~~~     这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,
~~~     和关系型数据库中的自增字段及时间戳类似。
~~~     这些被指定的列的类型不能使任意字符类型,如charvarchar等类型都不可以
~~~     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

 

 

posted on   yanqi_vip  阅读(33)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示