实时数仓案例(电商)

0 架构

1 ods

1 日志数据

前端(jar,产生日志数据)-》Nginx(集群间负载均衡)-》日志服务器(springboot,采集数据,jar)-》log,ods(kafka)

本地测试,本地起应用 -》 单机部署,单服务器起应用 -》 集群部署,集群起应用

2 业务数据

前端,jar,产生业务数据-》mysql,配置什么同步-》flinkcdc-》ods(kafka)

2 dim、dwd

1 用户行为日志

ods(Kafka)-> flink -> dwd(kafka)

1 识别新老用户

业务需要

2 日志数据拆分

这3类日志,结构不同,写回Kafka不同主题

2 业务数据

ods(kafka) -> flink -> 1 维度数据,dim(HBASE) 2 事实数据 dwd(kafka)

1 ETL

过滤控制

2 动态分流

维度数据到hbase 事实数据到kafka

怎么分流?

ods的表里面哪些是维度表,哪些是事实表,需要提前知道表的分类信息,后面才可以分流。业务库的表会变化,表的分类信息实时更新,需要动态同步。这里将表的分类信息存在mysql,利用广播流发送。

3 dwm

dmd(kafka)-> flink -> dwm(kafka)

1 访问uv计算

UV,unique visitor

2 跳出明细计算

跳出率=跳出次数 / 访问次数

3 订单主题表

4 支付主题表

4 dws

dwm(kafka)-> flink -> dws(clickhouse)

1 访客主题宽表

2 商品主题宽表

3 地区主题表

4 关键词主题表

5 ads

分层结构

DWM

https://blog.csdn.net/jianghuaijie/article/details/122009653

作用

DWM层的定位是什么,DWM层主要服务DWS,因为部分需求直接从DWD层到DWS层中间会有一定的计算量,而且这部分计算的结果很有可能被多个DWS层主题复用

构建

分主题

dwt

实时数仓没有dwt,因为dwt是累计统计,实时系统不适用

dws

作用

轻度聚合,生成一系列的中间表,提升公共指标的复用性,减少重复加工

分主题,便于管理

构建

分主题

宽表

轻度聚合

数仓主题和主题域

https://blog.csdn.net/qq_22473611/article/details/116702667

1 主题域、主题、实体的关系

主题域下面可以有多个主题,主题还可以划分成更多的子主题,主题和主题之间的建设可能会有交叉现象,而实体则是不可划分的最小单位

2 主题域划分

1 按照业务系统划分

2 按照业务过程划分

3 按照部门划分

离线数仓搭建例子(电商为例)

0 架构

1.数据来源

1.1 用户行为数据

用户在使用产品过程中,通过埋点收集与客户端产品交互过程中产生的数据,并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。用户行为数据通常存储在日志文件中。

我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。

普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

1.2 业务数据

就是各行业在处理事务过程中产生的数据。比如用户在电商网站中登录、下单、支付等过程中,需要和网站后台数据库进行增删改查交互,产生的数据就是业务数据业务数据通常存储在MySQL、Oracle等数据库中。

总共47张表,选了27张业务表

2 数据采集

1 用户行为数据

jar-》log(日志服务器)-》flume-》kafka-》flume-》hdfs

2 业务数据

jar-》mysql-》sqoop-》hdfs

3.ODS

hdfs(ori)-》hdfs(ods)

1 用户行为数据

1张表,topic_log -> ods_log

a.建表

就一个字段”line“

b 分区

首日,每日都是全量

c .数据装载

2 业务数据

27张表

0 整体

​ b 同步

​ c .数据装载

1.活动信息表

​ activity_info -> ods_activity_info

​ a 建表

​ 少了个“activity_desc”,多了”dt”

​ b 同步

​ 首日,每日都是全量

​ c .数据装载

4.DIM

hdfs(ods)-》hdfs(dim)

构建6张维度表

1 商品维度表

​ a 建表

​ b 分区

​ 首日,每日都是全量

​ c 数据装载

2 优惠券维度表

3 活动维度表

4 地区维度表

​ b 分区

​ 地区维度表数据相对稳定,变化概率较低,故无需每日装载,首日全量

5 时间维度表

​ b 分区

​ 通常情况下,时间维度表的数据并不是来自于业务系统,而是手动写入,并且时间维度表数据具有可预见性,无须每日导入,一般首日可一次性导入一年的数据

​ c 数据装载

​ 1)创建临时表tmp_dim_date_info

​ 2)将数据文件上传到HFDS上临时表指定路径/warehouse/gmall/tmp/tmp_dim_date_info/

​ 3)执行以下语句将其导入时间维度表

1
insert overwrite table dim_date_info select * from tmp_dim_date_info;

6 用户维度表

​ b 分区

​ 拉链表

https://cloud.tencent.com/developer/article/1752848#

​ c 数据装载

5.DWD

hdfs(ods)-》hdfs(dwd)

1 用户行为日志

0 日志数据拆解

ods_log由两部分构成,分别为页面日志和启动日志,拆解成5张表

1 启动日志表

​ b 分区

​ 首日,每日全量

​ c 数据装载

2 页面日志表

3 动作日志表

4 曝光日志表

5 错误日志表

2 业务数据

1 评价事实表(事务型事实表)

​ b 分区

​ c 数据装载

​ 首日,动态分区;每日,静态分区

2 订单明细事实表(事务型事实表)

3 退单事实表(事务型事实表)

4 加购事实表(周期型快照事实表)

​ b 分区

​ c 数据加载

5 收藏事实表(周期型快照事实表)

6 优惠券领用事实表(累积型快照事实表)

​ b 分区

​ c 数据加载

​ (1)首日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
insert overwrite table dwd_coupon_use partition(dt)
select
id,
coupon_id,
user_id,
order_id,
coupon_status,
get_time,
using_time,
used_time,
expire_time,
coalesce(date_format(used_time,'yyyy-MM-dd'),date_format(expire_time,'yyyy-MM-dd'),'9999-99-99')
from ods_coupon_use
where dt='2020-06-14';

​ (2)每日

7 支付事实表(累积型快照事实表)

8 退款事实表(累积型快照事实表)

9 订单事实表(累积型快照事实表)

6.DWS

hdfs(dwd)-》hdfs(dws)

0 整体

​ b 分区

​ c 数据装载

1 访客主题

2 用户主题

3 商品主题

4 优惠券主题

5 活动主题

6 地区主题

7.DWT

hdfs(dws)-》hdfs(DWT)

0 整体

c 数据装载

只保留当天和前一天的分区,过时的需要清理掉i

1 访客主题

2 用户主题

3 商品主题

4 优惠券主题

5 活动主题

6 地区主题

8.ADS

hdfs(DWT)-》hdfs(ADS)-》mysql

1 访客主题

1 访客统计

a 建表

指标 说明 对应字段
访客数 统计访问人数 uv_count
页面停留时长 统计所有页面访问记录总时长,以秒为单位 duration_sec
平均页面停留时长 统计每个会话平均停留时长,以秒为单位 avg_duration_sec
页面浏览总数 统计所有页面访问记录总数 page_count
平均页面浏览数 统计每个会话平均浏览页面数 avg_page_count
会话总数 统计会话总数 sv_count
跳出数 统计只浏览一个页面的会话个数 bounce_count
跳出率 只有一个页面的会话的比例 bounce_rate

b 分区

c 数据装载

第一步:对所有页面访问记录进行会话的划分。

第二步:统计每个会话的浏览时长和浏览页面数。

第三步:统计上述各指标。

2 路径分析

用户访问路径的可视化通常使用桑基图

2 用户主题

3 商品主题

4 订单主题

5 优惠券主题

6 活动主题

9.Azkaban全流程调度

就是将原来写的脚本文件串起来

数仓建模

关系建模和维度建模是两种数据仓库的建模技术。关系建模由Bill Inmon所倡导,维度建模由Ralph Kimball所倡导。目前主流为维度建模。

https://zhuanlan.zhihu.com/p/362991213

1.关系建模(范式建模)

1.1 范式

1 目的

降低数据的冗余性

2 目前业界范式

第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。逐个遵循,一般要求遵循第一,第二,第三范式,也就是三范式。

https://blog.csdn.net/Dream_angel_Z/article/details/45175621

1.2 建模

1 建模

关系建模将复杂的数据抽象为两个概念——实体和关系(实体表,关系表),并使用规范化(三范式)的方式表示出来

2 特点

关系模型严格遵循第三范式(3NF),数据冗余程度低,数据的一致性容易得到保证。

由于数据分布于众多的表中,查询会相对复杂,在大数据的场景下,查询效率相对较低。

2.维度建模

https://www.jianshu.com/p/daab50a23c56

https://cloud.tencent.com/developer/article/1772027

2.1 事实表和维度表

1 事实表

存储业务事实,事实表中的每行数据代表一个业务事件(下单、支付、退款、评价等)。

事实表的特征:

​ 内容相对的窄:列数较少(主要是外键id和度量值)

​ 非常的大

​ 经常发生变化,每天会新增加很多。

分类:事务型事实表,周期型快照事实表,累积型快照事实表

2 维度表

维度表:一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。 例如:用户、商品、日期、地区等。

维表的特征:

​ 维表的范围很宽(具有多个属性、列比较多)

​ 跟事实表相比,行数相对较小:通常< 10万条

​ 内容相对固定:编码表

2.2 维度模型分类

在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。

星座模型是多个星型模型交织

2.3 建模

1 建模

维度模型面向业务,将业务用事实表和维度表呈现出来。

步骤:

https://www.cnblogs.com/suheng01/p/13522677.html

选择业务过程→声明粒度→确认维度→确认事实

2 特点

维度模型以数据分析作为出发点,不遵循三范式,故数据存在一定的冗余。

表结构简单,故查询简单,查询效率较高。

数仓分层

https://blog.csdn.net/BeiisBei/article/details/105723188#_19

https://www.saoniuhuo.com/article/detail-72.html

https://www.dianjilingqu.com/20890.html

https://www.i4k.xyz/article/wjt199866/115184169#ODS__100

1.为什么要分层

1.清晰数据结构:每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
2.数据血缘追踪:简单来讲可以这样理解,我们最终给业务呈现的是一张能直接使用的张业务表,但是它的来源有很多,如果有一张来 源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
3.减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
4.把复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
5.屏蔽原始数据的异常:屏蔽业务的影响,不必改一次业务就需要重新接入数据。

2.分层结构

2.1 ODS层

作用

https://blog.csdn.net/xuebo_911/article/details/8156016#

起到备份数据的作用

构建

1 直接加载原始日志、数据,保持原貌不做处理

2.2 DIM层

dim存放维度表,dwd存放事实表

作用

维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。

构建

https://help.aliyun.com/document_detail/137615.html

1 构建维度表,主要是对业务事实的描述信息,例如何人,何时,何地等

2.3 DWD层

作用

保存业务事实明细,一行信息代表一次业务行为,例如一次下单。

构建

1 对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据、脱敏等)

2 构建事实表

https://help.aliyun.com/document_detail/114457.html

2.4 DWS

作用

避免重复计算

1)问题引出

两个需求,统计每个省份订单的个数、统计每个省份订单的总金额,都是将省份表和订单表进行join,group by省份,然后计算。同样数据被计算了两次,实际上类似的场景还会更多。

2) 那怎么设计能避免重复计算呢?

针对上述场景,可以设计一张地区宽表,其主键为地区ID,字段包含为:下单次数、下单金额、支付次数、支付金额等。上述所有指标都统一进行计算,并将结果保存在该宽表中,这样就能有效避免数据的重复计算。

构建

https://help.aliyun.com/document_detail/126913.html

0 分主题

1 构建宽表

2 以DWD为基础,按天进行轻度汇总。DWS层存放的所有主题对象当天的汇总行为,例如每个地区当天的下单次数,下单金额等

2.5 DWT

和DWS区别

DWS按天进行轻度汇总,DWT累积汇总

作用

避免重复计算

构建

0 分主题

1 构建宽表

2 以DWS为基础,对数据进行累积汇总。DWT层存放的是所有主题对象的累积行为,例如每个地区最近7天(15天、30天、60天)的下单次数、下单金额等

2.6 ADS层

作用

为各种统计报表提供数据

构建

1 由于这层的数据量不大,所有没有分区,列式存储,压缩

3.构建过程

借助hive,主要就是写SQL,核心步骤就是:

1.建表

2.分区规划

​ 按什么分区,比如说按天,按月

​ 注意数据同步策略,全量,增量等

3.数据装载

​ 注意首日,每日

联系业务和不同层的要求

4.全流程调度

Azkaban


:D 一言句子获取中...