离线数仓中为什么要分层?
简单概述一下:
- 解耦
- 提高数据复用性(最重要)
- 将复杂需求简单化,从原本的需要执行十几步,分层之后只需做一步两步
- 防止重复计算
- 可以屏蔽敏感数据
普通的实时计算优先考虑时效性,所以从数据源采集经过实时计算直接得到结果。如此
做时效性更好,但是弊端是由于计算过程中的中间结果没有沉淀下来,所以当面对大量实时
需求的时候,计算的复用性较差,开发成本随着需求增加直线上升。
实时数仓基于一定的数据仓库理念,对数据处理流程进行规划、分层(传统实时计算和实时数仓最重要的区别),目的是提高数据的复用性,弊端:会牺牲一定时效性;如图:经过计算流程a,由于需要给B和C共同使用,需要把他的结果保存下来,因此会牺牲时效性,但是生产环境中表特别多,需求特别多,复用性是更为重要的一个因素。这也是为什么实时数仓比离线数仓多出一个DWM层的原因——提高复用性!
- ODS:原始数据,日志和业务数据
- DWD:根据数据对象为单位进行分流(通过侧输出流),比如订单、页面访问等等
- DIM:维度数据
- DWM:对于部分数据对象进行进一步加工,比如独立访问、跳出行为,也可以和维度 进行关联,形成宽表,依旧是明细数据。
- DWS:根据某个主题将多个事实数据轻度聚合,形成主题宽表。
- ADS:把ClickHouse中的数据根据可视化需进行筛选聚合(实时数据不需要落盘)
ODS、DWD、DWM放Kafka中
把DIM放入Hbase,结合Phoenix使用
DWS放入ClickHouse
为什么不把DIM数据也放入Kafka中?
之前离线数仓维度数据是怎么使用的 ?
事实表关联维度表使事实表的数据补充的更全面一些;例如根据事实表中的一个uid去查DIM层的user_info表,然后把维度数据补充到事实表里面
再思考实时数仓:Kafka的数据默认保留七天,自定义的可能更少,Kafka中数据之间不好关联
结论:
1.无法永久保留数据,维度数据并不能删掉
2.维度数据保存在Kafka中无法与其他数据关联



