文章目录

  • 第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 层。

实时数仓 flink搭建教程 flink实时数仓项目实战_kafka

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 读取配置信息表,将配置流作为广播流与主流进行连接。所以就有了如下图:

实时数仓 flink搭建教程 flink实时数仓项目实战_java_02

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。 那这

几个我们什么时候会用到呢?如何选择?

实时数仓 flink搭建教程 flink实时数仓项目实战_java_03


实时数仓 flink搭建教程 flink实时数仓项目实战_hbase_04


从对比表中能明显看出,Rich 系列能功能强大,ProcessFunction 功能更强大,但是相对的越全面的算子使用起来也更加繁琐。