场景清单
删除、更新:
主键:
版本管理:
insert into table
insert overwrite table
Job 之间的依赖关系:
并行:
Hive 分区:
hdfs:
交易流水表日终文件导入:
交易流水表数据库导入:
幂等性 用于贴源数据层之外的层级
名字解释
全量表:
全量抽取,每个分区保留历史全量快照。
适用于与增量表对比,然后生成对应日期的快照。
增量表:
使用场景:适用于数据量比较大的情况。
两种增量导入方案:
按照ID 合并,把第一种表中ID 不存在的数据插入到表中,进行合并
两张表union 一下,去重过滤 取数据最新的一条。
流水表:
每天增量到,insert into 到一个文件。
如用户行为数据,仅仅是insert,没有update 的数据。
按照update_time 每天增量导入即可。
拉链表:
维护历史状态,以及最新状态数据
适用情况:
1.数据量比较大
2.表中的部分字段会被更新
3.需要查看某一个时间点或者时间段的历史快照信息
查看某一个订单在历史某一个时间点的状态
某一个用户在过去某一段时间,下单次数
4.更新的比例和频率不是很大
如果表中信息变化不是很大,每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费
优点
1、满足反应数据的历史状态
2、最大程度节省存储
什么是拉链表
记录每条信息的生命周期,一旦一条信息的生命周期结束,就重新开始一条新纪录,并把当前日期放入生效日期。 如果当前日期至今有效,在结束日期放入一个最大值,例如(9999-99-99)
- 优势:订单1经历了四个生命周期,如果每天增量同步数据,则一年有365条数据,而拉链表只会产生4条数据
制作拉链表
首先初始化拉链表
通常要在原表的基础上加入start_date,end_date,并从原表导入数据到拉链表
drop table if exists dwd_order_info_his;
create external table dwd_order_info_his(idstring COMMENT ‘订单编号’,order_statusstring COMMENT ‘订单状态’,start_datestring COMMENT ‘有效开始日期’,end_datestring COMMENT ‘有效结束日期’
) COMMENT ‘订单拉链表’
创建临时表整个中间数据
临时表和拉链表表结构一致,只是为了存储中间过程。
drop table if exists dwd_order_info_his_tmp;
create external table dwd_order_info_his_tmp(id string COMMENT ‘订单编号’,order_status string COMMENT ‘订单状态’,start_date string COMMENT ‘有效开始日期’,end_date string COMMENT ‘有效结束日期’
) COMMENT ‘订单拉链临时表’
向临时表中插入数据
插入前,拉链表数据
订单新增表数据
插入数据后
订单1和订单2,订单状态都发生了改变,产生了新数据
具体sql
insert overwrite table dwd_order_info_his_tmp
select * from
(
select
id,
total_amount,
order_status,
user_id,
payment_way,
out_trade_no,
create_time,
operate_time,
‘2019-02-14’ start_date,
‘9999-99-99’ end_date
from dwd_order_info where dt=’2019-02-14’
union all
select oh.id,
oh.total_amount,
oh.order_status,
oh.user_id,
oh.payment_way,
oh.out_trade_no,
oh.create_time,
oh.operate_time,
oh.start_date,
if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date
from dwd_order_info_his oh left join
(
select
from dwd_order_info
where dt=’2019-02-14’
) oi
on oh.id=oi.id and oh.end_date=’9999-99-99’
)his
order by his.id, start_date;
其中第一部分是吧2019-02-14所有新增和变化的数据插入临时表,第二部分是原历史表和新增变化表左连接,如果新增变化变存在id,则end_date置为前一天。如果没有匹配到,代表没有变化,end_date保持不变。同时记得条件要有end_date=’9999-99-99’,表示只与当前最新的订单状态进行匹配。
将拉链表数据用临时表覆盖
因为hive修改字段值不方便,直接全变覆盖
insert overwrite table dwd_order_info_his
insert into table
select from dwd_order_info_his_tmp;
增量表、全量表、拉链表、流水表
增量表: 必须要有判断增量的字段,有ID 或者update_time 两种方式,使用update_time
按update_time 做增量。
数据不丢失,可以反映每天的数据变化。
按id 做增量。
全量表:可以每天到一个全量的数据,然后保留最近几天的数据。
按天分区适用于数据量比较小的表,不能反映数据的历史变化。
数据库合并:不同数据库的表 可以合并到一个表,
删除:增量数据与每天全量数据之间做join,对删除的数据做标记。
批量生成datax json 文件,如果用的是SQLserver 应该搭建一套SQLServer数据库的环境。
熟悉数据
Hive 分区表:
单个分区可以做到重跑。
datax conf file ,传递参数,动态传参。
dataX 增量导入。
datax 全量导入。
全量分区表。 insert update
按天分区,数据保留最近7天的数据。
增量分区表,数据量比较大的时候。
分区支持重跑,先全量导数据至一个分区,后面分区是每天一个增量。
技术选型
数据仓库使用hive,底层存储使用hdfs.
数据同步工具使用datax
调度工具使用dolphinSchudule.
场景清单
1、数据库删除的数据,依旧存在于数仓中,如何把删除的数据反映出来。
使用增量表与全量表相结合的方式,通过主键关联,把已经删除的数据查询出来。
比如用户表。
2、应该支持数据的快照功能,可以从抽取的数据中,反映每天数据库的快照。
使用update_time 做增量,每天增量同步一次。可以筛选出每天的数据的快照。
3、数据仓库从根本上解决问题。
初次导入数据很关键,一定要把数据导入做到尽量的全。
4、数据量大,很少变化的表,如何在确保数据完整性与导入效率之间做一个权衡。
如不经常变化的维表,反映出维表变化历史。
每天的变化最终只能反映一次。
如:各个乡镇编码的维表。
商品品类的维表。
5、导数的重跑,如何确保幂等性?
增量分区表: 删除hdfs 上的数据,删除分区。
全量表:删除hdfs 上的数据,删除分区。
要遵循对于错误的数据要先删除,在insert 的原则。
6、 数据的依赖项问题
数据同步的时候,不存在依赖性问题。可能有个别ETL作业存在依赖性。
有些时候,周报,依赖于日报。
需要把最近日报任务跑通,然后根据日报的计算结果,产生周报。
使用dolpinScheduler 的作业依赖来解决。
7、工作的原则性
先满足绝大多数的共性问题,然后处理个别比较特殊,比较复杂的问题。
8、dataX 动态传参的问题:
使用datax采集数据时,想用不同参数执行,但是又不想改变配置文件,这时,就需要在执行命令动态传参进去配置文件,具体步骤如下:
1,目的:动态赋值去采集数据,部分配置文件如下
“content”: [
{
“reader”:{
“name”:”mysqlreader”,
“parameter”:{
“username”:”root”,
“password”:”root”,
“column”:[
id
],
“splitPk”: “”,
“connection”:[
{
“table”:[“{where}”
}
}
,”transformer”: [
2.通过执行命令动态赋值,采集数据
python /datax/bin/datax.py -p”-Dtable=’test’ -Dwhere=’1=1’” config/2020-05-13/test.json
3.注意:这里有两个动态参数,table 和 {table}和table和{where},在执行命令赋值的时候,顺序得一致,并且单词也要一样,固定语法就是【 -D**= 】
9、如何使用svn 把代码按照版本托管起来,以及代码上线的流程。
实现一、
1、开发工程师提交代码到svn.
2、运维工程师在服务器上把svn 上的代码下载下来。
代码应该包括Scheluder 调度时间,需要调用的脚本。
3、在服务器上把代码上线到Scheluler,完成上线操作.
实现二、
1、开发工程师提交代码到svn,使用svn 做代码版本管理。
2、开发工程师从把svn 的代码,copy 到调度系统_上,创建工作流。
3、在dolpinSchuler 中,设置调度任务,配置调度时间。
10、数据同步作业失败的时候,如何及时了解到以及及时查看作业失败的日志。
数据job 监控报警。
11、需要确定一个业务数据库与hive 字段类型转换的,映射关系。
业务库的大多数字段类型,都可以转换成hive string 类型.
这个在生成hive建表语句的情况下,会用到.
12、需要统计每个数据库表的,全量的数据量和每天增加的数据量.
13、hive表的规则设定.
1、hive 全部创建外部表.
2、Hive 分区规则的设定,按天分区,数据每天导入或者转换一次。
3、全量表的的冗余规则,全量切片表保留几天,不可能每天都保留一个全量。应该设定一个保留天数,既考虑数据有冗余性,也要考虑存储空间的利用效率.
14、数据表多的问题.
15、字段发生变化的问题,增加字段,减少字段.
16、补数的情况:
补数的情况下,应该告诉我们,或者 把当前补数的时间字段update_time设置成成当前字段,至少要保证业务数据可以整合到数仓。
17、分库合并的问题。
每天把各个分库导入到HDFS的同一个目录下。
数据同步流程。
1、先搭建一个sqlServer。
2、在SQLServer 创建几张表。
3、然后向SQLServer 中,插入几条数据。
4、使用datax 把SQLServer中的数据导入到hdfs.
5、把hdfs 中的数据加载到hive。
6、把编写的脚本使用DolphinScheuler调度。
7、然后全量分区表、增量分区表、流水表分别做一个案例。
全量分区表:
