场景清单

    删除、更新:
    主键:
    版本管理:

    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(
      id string COMMENT ‘订单编号’,
      order_status string COMMENT ‘订单状态’,
      start_date string COMMENT ‘有效开始日期’,
      end_date string 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 做增量。

    全量表:可以每天到一个全量的数据,然后保留最近几天的数据。

    1. 按天分区
    2. 适用于数据量比较小的表,不能反映数据的历史变化。

    数据库合并:不同数据库的表 可以合并到一个表,

    删除:增量数据与每天全量数据之间做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、然后全量分区表、增量分区表、流水表分别做一个案例。

    全量分区表: