文章目录
增量采集、处理、导出
一、增量采集
1.增量采集的业务需求
离线与实时
离线:以时间为单位来实现数据的处理:采集、计算
- 场景:每天处理一次,每个小时处理一次,每个月,每年
- 特点:时效性比较低,一般都是分钟级别
- 工具:Hadoop生态圈
- Sqoop、HDFS、Hive、MapReduce、SparkCore、SparkSQL、Tez、Impala、Sqoop、MySQL
实时:以数据为单位的实现数据的处理:采集、计算
- 场景:产生一条数据就要立刻采集以及处理一条数据
- 特点:时效性非常高,一般都是毫秒级别
- 工具:实时生态圈
- Flume、Canal、Kafka、SparkStreaming/Flink、Redis、Hbase
离线需求
- 实现离线采集、离线计算、离线结果保存
- 所有过程:都是增量的过程
增量与全量
- 全量:每次都所有数据进行处理
- 一般用于数据迁移、维度表的更新
- 增量:每次对最新【新增、更新】的数据进行处理
- 工作中主要的场景
2.增量采集的方案
Flume:增量文件采集
- exec:tail命令,动态的获取文件的尾部
- tail命令,自动读取文件的尾部
- taildir:动态实时监控多个文件
- 记录文件的采集位置:taildir_position.json
- 实现增量采集
Sqoop:增量采集数据库
-
方式一:按照某一列自增的int值来实现:append
- 要求:必须有一列自增的int值,必须有主键
- 特点:只能采集新增的数据
-
方式二:按照数据变化的时间列的值来实现:lastmodifield
- 要求:必须有一列时间列,时间列随着数据的更新而自动更新
- 特点:能采集新增和更新的数据
-
方式三:通过指定目录分区采集到对应的HDFS目录下
- 要求:表中有两个字段
- create_time:创建时间
- 新增的数据
- 要求:表中有两个字段
-
update_time:更新时间
- 更新的数据
-
怎么解决更新和新增数据的问题:通过SQL的过滤
-e "select * from table where substr(create_time,1,10) = '2021-05-16' or substr(update_time,1,10) = '2021-05-16'“
- 增量要求目录是提前存在,追加新增的数据进入,没有使用官方提供的增量,目录不能提前存在
--target-dir /nginx/log/2021-05-15/
- 问题:如何通过Sqoop将数据采集到Hive的分区表中?
- –hive-partition-key daystr:指定分区的字段是哪个字段
- –hive-partition-value 2021-05-15:指定导入哪个分区
- 原理
- 根据指定的参数,在HDFS中创建一个目录:key=value
table/daystr=2021-05-15
-
在Hive中加载分区即可
-
方式二:通过手动指定HDFS方式来代替
--target-dir /nginx/log/daystr=2021-05-15/hourstr=00
3.增量采集的实现
- 创建MySQL测试数据表
create database if not exists db_order;
use db_order;
drop table if exists tb_order;
create table tb_order(
id varchar(10) primary key,
pid varchar(10) not null,
userid varchar(10) not null,
price double not null,
create_time varchar(20) not null
);
- 插入测试数据
insert into tb_order values('o00001','p00001','u00001',100,'2021-05-13 00:01:01');
insert into tb_order values('o00002','p00002','u00002',100,'2021-05-13 10:01:02');
insert into tb_order values('o00003','p00003',