数据采集方式
- 全量:导入所有数据
- 增量:只导入最新的数据【新产生的数据和发生变化的数据】
- 举例
- 2020-01-01:今天Mysql产生的数据
1 laoda 20
2 laoer 30
3 laosan 40
- 2020-01-02:对昨天产生的数据进行采集分析
- HDFS采集的数据
1 laoda 20
2 laoer 30
3 laosan 40
- Mysql中的数据
1 laoba 20
2 laoer 30
3 laosan 40
4 laosi 50
5 laowu 60
-
2020-01-03:对昨天产生的数据进行采集分析
-
HDFS采集的数据
1 laoba 20
2 laoer 30
3 laosan 40
4 laosi 50
5 laowu 60
- 之前已经采集过的数据,不需要再次采集,只采集最新的数据
- 例如订单业务
- 2020-01-01
- 2020-01-01 laoda 成功订单
- 2020-01-02:采集1号的订单分析前一天的订单数据
- 总共成交订单
- 订单总金额
- 这一天也产生许多的订单并且1号的订单有变化
- 2020-01-02 laoda 退款订单
- 2020-01-03:采集2号的订单分析前一天的数据
- 只需要采集2号的新的订单,1号的订单不用再采集了
- 如果有之前的订单发生了变化,也需要进行采集
Sqoop中增量的实现
Incremental import arguments:
--check-column <column> Source column to check for incremental
change
--incremental <import-type> Define an incremental import of type
'append' or 'lastmodified'
--last-value <value> Last imported value in the incremental
check column
- –incremental:指定增量导入的方式
- append:追加导入,只导入增加的数据
- lastmodified:根据时间戳来进行导入,增加了 新的数据或者数据被更新都会被导入
- –check-column:按照哪一列进行增量导入
- –last-value:指定这一列上一次的值是什么
Append:追加增量
- 特点:根据某一列int值做判断,每次只导入大于上一次的值的数据
- 要求:指定的列必须为int类型的标识列,自动增长的主键
- 第一次导入:全量导入
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_tohdfs \
--delete-target-dir \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
-m 1
-
第二天:产生了新的数据
-
在Mysql中执行
insert into tb_tohdfs values(null,"laowu",22);
insert into tb_tohdfs values(null,"laoliu",23);
insert into tb_tohdfs values(null,"laoqi",24);
insert into tb_tohdfs values(null,"laoba",25);
- 第二次导入:增量导入,以id作为增量判断的列
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1
lastmodified:按照时间戳进行导入
- 特点:只要数据发生变化,就会被导入,既导入新增加的数据又导入发生改变的数据
- 要求:必须要有数据变化时间这一列
- 测试
- Mysql创建测试数据
CREATE TABLE `tb_lastmode` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`word` varchar(200) NOT NULL,
`lastmode` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into tb_lastmode values(null,'hadoop',null);
insert into tb_lastmode values(null,'spark',null);
insert into tb_lastmode values(null,'hbase',null);
- 第一次导入HDFS
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--incremental lastmodified \
--check-column lastmode \
--last-value '2020-01-01 00:00:00' \
-m 1
- 第二天:数据发生了变化
insert into tb_lastmode values(null,'hive',null);
update tb_lastmode set word = 'sqoop' where id = 1;
- 第二次采集
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--merge-key id \
--incremental lastmodified \
--check-column lastmode \
--last-value '2020-06-11 13:35:46' \
-m 1
-
会启动两个MapReduce
- 第一个MapReduce按照时间将最新的数据进行采集
- 第二个MapReduce实现按照id进行合并,用新的值代替老的值
总结
为什么要做增量?
- 只有第一次是所有数据全部采集
- 后面的每一次都只采集最新的数据
方式一:append
- 实现:根据某一列int类型的值,来判断,大于上一次的值就会被采集,这个值必须为递增的
- 特点:只能采集增加的数据
- 要求:必须有一列增加的Int列
方式二:lastmodified
- 实现:根据数据修改的时间戳来采集数据,只要大于上一次的采集时间,就会被采集
- 特点:既能采集增加的数据又能采集更新的数据
- 要求:必须要有时间这一列
这个在工作中反而用的不多