文章目录
- 第1章 需求分析及实现思路
- 1.1 分层需求分析
- 1.2 每层的职能
- 1.3 DWD 层数据准备实现思路
- 第2章 功能 1:环境搭建
- 第3章 功能 2:准备用户行为日志 DWD 层
- 3.1 主要任务
- 3.1.1 识别新老用户
- 3.1.2 利用侧输出流实现数据拆分
- 3.1.3 将不同流的数据推送下游的 Kafka 的不同 Topic 中
- 3.2 代码实现
- 第4章 功能 3:准备业务数据 DWD 层
- 4.1 主要任务
- 4.1.1 接收 Kafka 数据,过滤空值数据
- 4.1.2 实现动态分流功能
- 4.1.3 把分好的流保存到对应表、主题中
- 4.2 代码实现
- 第5章 总结
本博客内容出自尚硅谷b站公开课,如有侵权,请联系博主删除
第1章 需求分析及实现思路
1.1 分层需求分析
在之前介绍实时数仓概念时讨论过,建设实时数仓的目的,主要是增加数据计算的复用性。每次新增加统计需求时,不至于从原始数据进行计算,而是从半成品继续加工而成。
我们这里从 Kafka 的 ODS 层读取用户行为日志以及业务数据,并进行简单处理,写回到 Kafka 作为 DWD 层。
1.2 每层的职能
分层 | 数据描述 | 生成计算工具 | 存储媒介 |
ODS | 原始数据,日志和业务数据 | 日志服务器,FlinkCDC | Kafka |
DWD | 根据数据对象为单位进行分流,比如订单、页面访问等等。 | Flink | Kafka |
DWM | 对于部分数据对象进行进一步加工,比如独立访问、跳出行为。依旧是明细数据。 | Flink | Kafka |
DIM | 维度数据 | Flink | HBase |
DWS | 根据某个维度主题将多个事实数据轻度聚合,形成主题宽表。 | Flink | Clickhouse |
ADS | 把 Clickhouse 中的数据根据可视化需要进行筛选聚合。 | Clickhouse SQL | 可视化展示 |
1.3 DWD 层数据准备实现思路
- 功能 1:环境搭建
- 功能 2:计算用户行为日志 DWD 层
- 功能 3:计算业务数据 DWD 层
第2章 功能 1:环境搭建
略
第3章 功能 2:准备用户行为日志 DWD 层
我们前面采集的日志数据已经保存到 Kafka 中,作为日志数据的 ODS 层,从 Kafka 的 ODS 层读取的日志数据分为 3 类, 页面日志、启动日志和曝光日志。这三类数据虽然都是用户行为数据,但是有着完全不一样的数据结构,所以要拆分处理。将拆分后的不同的日志写回 Kafka 不同主题中,作为日志 DWD 层。
页面日志输出到主流,启动日志输出到启动侧输出流,曝光日志输出到曝光侧输出流
3.1 主要任务
3.1.1 识别新老用户
本身客户端业务有新老用户的标识,但是不够准确,需要用实时计算再次确认(不涉及业务操作,只是单纯的做个状态确认)。
3.1.2 利用侧输出流实现数据拆分
根据日志数据内容,将日志数据分为 3 类, 页面日志、启动日志和曝光日志。页面日志输出到主流,启动日志输出到启动侧输出流,曝光日志输出到曝光日志侧输出流
3.1.3 将不同流的数据推送下游的 Kafka 的不同 Topic 中
3.2 代码实现
略
第4章 功能 3:准备业务数据 DWD 层
业务数据的变化,我们可以通过 FlinkCDC 采集到,但是 FlinkCDC 是把全部数据统一写入一个 Topic 中, 这些数据包括事实数据,也包含维度数据,这样显然不利于日后的数据处理,所以这个功能是从 Kafka 的业务数据 ODS 层读取数据,经过处理后,将维度数据保存到 HBase,将事实数据写回 Kafka 作为业务数据的 DWD 层。
4.1 主要任务
4.1.1 接收 Kafka 数据,过滤空值数据
对 FlinkCDC 抓取数据进行 ETL,有用的部分保留,没用的过滤掉
4.1.2 实现动态分流功能
由于 FlinkCDC 是把全部数据统一写入一个 Topic 中, 这样显然不利于日后的数据处理。所以需要把各个表拆开处理。但是由于每个表有不同的特点,有些表是维度表,有些表是事实表。
在实时计算中一般把维度数据写入存储容器,一般是方便通过主键查询的数据库比如 HBase,Redis,MySQL 等。一般把事实数据写入流中,进行进一步处理,最终形成宽表。
这样的配置不适合写在配置文件中,因为这样的话,业务端随着需求变化每增加一张表,就要修改配置重启计算程序。所以这里需要一种动态配置方案,把这种配置长期保存起来,一旦配置有变化,实时计算可以自动感知。
这种可以有两个方案实现
- 一种是用 Zookeeper 存储,通过 Watch 感知数据变化;
- 另一种是用 mysql 数据库存储,周期性的同步;
- 另一种是用 mysql 数据库存储,使用广播流。
这里选择第二种方案,主要是 MySQL 对于配置数据初始化和维护管理,使用 FlinkCDC 读取配置信息表,将配置流作为广播流与主流进行连接。所以就有了如下图:
4.1.3 把分好的流保存到对应表、主题中
- 业务数据保存到 Kafka 的主题中
- 维度数据保存到 HBase 的表中
4.2 代码实现
略
- 4.2.1 接收 Kafka 数据,过滤空值数据
- 4.2.2 根据 MySQL 的配置表,动态进行分流
- 4.2.3 分流 Sink 之保存维度到 HBase(Phoenix)
- 4.2.4 分流 Sink 之保存业务数据到 Kafka 主题
第5章 总结
DWD 的实时计算核心就是数据分流,其次是状态识别。在开发过程中我们实践了几个
灵活度较强算子,比如 RichMapFunction, ProcessFunction, RichSinkFunction。 那这
几个我们什么时候会用到呢?如何选择?
从对比表中能明显看出,Rich 系列能功能强大,ProcessFunction 功能更强大,但是相对的越全面的算子使用起来也更加繁琐。