文章目录
一 DWD层需求分析及实现思路
1 分层需求分析
建设实时数仓的目的,主要是增加数据计算的复用性。每次新增加统计需求时,不至于从原始数据进行计算,而是从半成品继续加工而成。
这里从kafka的ods层读取用户行为日志以及业务数据,并进行简单处理,写回到kafka作为dwd层。
2 每层的职能
分层 | 数据描述 | 生成计算工具 | 存储媒介 |
---|---|---|---|
ODS | 原始数据,日志和业务数据 | 日志服务器,maxwell | kafka |
DWD | 根据数据对象为单位进行分流,比如订单、页面访问等等。 | FLINK | kafka |
DWM | 对于部分数据对象进行进一步加工,比如独立访问、跳出行为。依旧是明细数据。 | FLINK | kafka |
DIM | 维度数据 | FLINK | HBase |
DWS | 根据某个维度主题将多个事实数据轻度聚合,形成主题宽表。 | FLINK | Clickhouse |
ADS | 把Clickhouse中的数据根据可视化需要进行筛选聚合。 | Clickhouse SQL | 可视化展示 |
3 DWD层职能详细介绍
(1)用户行为日志数据
根据日志的不同类别做分流。
前端埋点中的数据全部放在kafka中ods_base_log主题中,如启动日志,页面访问日志,曝光日志等。虽然同是日志,但是却分为不同的种类,将来做数据统计时,全部从这一个主题中获取数据不方便。所以需要从ods_base_log主题中将数据取出来,根据日志的类型,将不同类型的数据放到不同的主题中,进行分流操作,如启动日志放到启动主题中,曝光日志放到曝光主题中,页面日志放到日志主题中。
(2)业务数据
根据业务数据的类型(维度 or 事实)做分流。
MySQL存储的业务数据中有很多张表,这些表分为两类,一类是事实表,一类是维度表。在采集数据时,只要业务数据发生变化就会通过maxwell采集到kafka的ods_base_db_m主题中,并没有区分事实和维度。如果是事实数据,希望将其放到kafka的不同单独主题中,如订单主题,订单明细主题,支付主题等。对于维度数据,不适合存放在kafka中,kafka不适合做长期存储,默认存储7天。海量数据的分析计算,同样不适合存放到MySQL中,因为在做分析计算时要不停的进行查询操作,给业务数据库造成很大的压力,且MySQL对于大量数据的查询,性能也较差。
在使用维度数据时,需要根据维度id查询出具体的数据,K-V型数据库比较适合存储维度数据,根据K获取V效率较高,KV数据库包括Redis和Hbase,Redis对于长期存储压力比较大,最终选择Hbase存储维度数据。
4 DWD层数据准备实现思路
- 功能1:环境搭建。
- 功能2:计算用户行为日志DWD层。
- 功能3:计算业务数据DWD层。
二 环境搭建
1 创建maven工程
创建maven工程,gmall2022-realtime。
2 修改配置文件
(1)添加依赖
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<flink.version>1.12.0</flink.version>
<scala.version>2.12</scala.version>
<hadoop.version>3.1.3</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_${scal