当前位置:网站首页>Flink实时数仓完结
Flink实时数仓完结
2022-07-30 14:10:00 【未来影子】
先看项目成品的效果

GitHub地址:https://github.com/GTyingzi/Flink_Demo
Gitee地址:https://gitee.com/gtcs/Flink-Demo
主要框架版本选型
| 框架 | 版本 |
|---|---|
| Hadoop | 3.13 |
| Zookeeper | 3.5.7 |
| Kafka | 2.4.1 |
| HBase | 2.0.5 |
| Phoenix | 5.0.0 |
| MySQL | 5.7.16 |
| Redise | 6.2.1 |
| ClickHouse | 20.4.5.36 |
| Flink | 1.13.0 |
| Nginx | 1.12.2 |
| java | 1.8.0_212 |
| SpringBoot | 2.3.7 |
| scala | 2.12 |
集群服务器规划
| 服务名称 | 子服务 | 服务器(hadoop102) | 服务器(hadoop103) | 服务器(hadoop104) |
|---|---|---|---|---|
| HDFS | NameNode | √ | ||
| DataNode | √ | √ | √ | |
| Zookeeper | Zookeeper Server | √ | √ | √ |
| Kafka | Kafka | √ | √ | √ |
| MySQL | MySQL | √ | ||
| Redise | Redis | √ | ||
| ClickHouse | ClicHouse | √ | ||
| Nginx | Nginx | √ | ||
| HBase | HMaster | √ | ||
| HRegionServer | √ | √ | √ | |
| Flink | Flink | √ | √ | √ |
| Phoenix | Phoenix | √ |
实时架构

- ODS:原始数据,日志、业务数据
- DWD:根据数据对象为单位进行分流,比如订单、页面访问等
- DIM:维度数据
- DWM:对部分数据对象进行进一步加工,也可和维度数据进行关联,形成宽表
- DWS:根据某个主题将多个事实数据轻度聚合,形成主题宽表
- ADS:将ClickHouse中的数据可视化
架构的选择
分层分析
ODS
数据源:行为数据,业务数据
架构分析:
FlinkCDC:
DataStream/FlinkSQL
FlinkCDC/Maxwell/Canal
保持数据原貌,不做任何修改!
ods_base_log,ods_base_db
DWD-DIM
行为数据:DWD(Kafka)
1、过滤数据 -> 侧输出流 脏数据率
2、新老用户校验 -> 前台校验不准
3、分流 -> 侧输出流 页面、启动、曝光、动作、错误
4、写入Kafka
业务数据:DWD(Kafka)-DIM(Phoenix)
1、过滤数据 -> 删除数据
2、读取配置表创建广播流
3、连接主流和广播流
1)广播流数据:
a、解析数据
b、Phoenix建表
c、写入状态广播
2)主流数据
a、读取状态
b、过滤字段
c、分流(添加SinkTable字段)
4、提取Kafka和HBase流分别对应的位置
5、HBase流:自定义Sink
6、Kafka流:自定义序列化方式
DWM
DWM的定位:服务DWS,部分需求直接从DWD到DWS中间会有一定的计算量,而且这部分计算结果可能被多个DWS主题复用,故这部分DWD会形成一层DWM,这里主要有四个业务:访问UV计算、跳出明细计算、订单宽表、支付宽表
UV(Unique Visitor):独立访客,在实时计算中又被称为DAU(Daily Active User)。从用户行为日志中识别出当日的访客
1、识别出该访客打开的第一个页面,表示该访客开始进入我们的应用
2、访客一天内能多次进入应用,在一天范围内要进行去重
跳出:用户成功访问了网站的一个页面后就退出。不在继续访问网站的其他页面。跳出率 = 跳出次数/访问次数,关注跳出率可以看出引流来的访客是否能很快被吸引,渠道引流来的用户质量对比。跳出行为特征(本质是条件时间+超时时间的组合)
1、该页面是用户近期访问的第一个页面
2、首次访问之后很长一段时间,用户没继续再有其他页面的访问
订单宽表:订单是统计分析的重要对象,围绕订单有很多的维度统计需求,如用户、地区、商品、品类、品牌等为了之后统计计算方便,减少大表之间的关联,故在实时计算过程中将围绕订单的相关数据整合成为一种订单宽表
旁路缓存优化
异步查询优化
支付宽表:支付宽表的目的,最主要的原因是支付表没有到订单明细,支付金额没有细分到商品上,没有办法统计商品级的支付状况。支付宽表的核心是支付表的信息与订单宽表关联上
1、一个是把订单宽表输出到 HBase 上,在支付宽表计算时查询 HBase,这相当于把订单宽表作为一种维度进行管理
2、一个是用流的方式接收订单宽表,然后用双流 join 方式进行合并。因为订单与支付产生有一定的时差。所以必须用 intervalJoin 来管理流的状态时间,保证当支付到达时订单宽表还保存在状态中。
DWS
DWS层的定位:
轻度聚合,因为 DWS 层要应对很多实时查询,如果是完全的明细那么查询的压力是非常大的
将更多的实时数据以主题的方式组合起来便于管理,同时也能减少维度查询的次数
需求分析与思路:
接收各个明细数据,变为数据流
把数据流合并在一起,成为一个相同格式对象的数据流
对合并的流进行聚合,聚合的时间窗口决定了数据的时效性
把聚合结果写在数据库中
FlinkCDC的选取
| FlinkCDC | Maxwell | Canal | |
|---|---|---|---|
| 断点续传 | CK | MySQL | 本地磁盘 |
| SQL -> 数据 | 无 | 无 | 一对一(炸开) |
| 初始化功能 | 有(多库多表) | 有(单表) | 无 |
| 封装格式 | 自定义 | JSON | JSON(c/s自定义) |
| 高可用 | 运行集群高可用 | 无 | 集群(ZK) |
旁路缓存优化
一种非常常见的按需分配缓存的模式。如下图,任何请求优先访问缓存, 缓存命中,直接获得数据返回请求。如果未命中则,查询数据库,同时把结果写入缓存以备 后续请求使用

该缓存策略的注意事项
- 缓存要设过期时间,不然冷数据会常驻缓存浪费资源
- 要考虑维度数据是否会发生变化,如果发生变化要主动清除缓存
缓存选型
一般两种:堆缓存或者独立缓存服务(redis,memcache)
- 堆缓存:性能角度看更好,访问数据路径更短,减少过程消耗。但是管理性差, 其他进程无法维护缓存中的数据
- 独立缓存服务:本身性能也不错,不过会有创建连接、网络 IO 等消耗。但是考虑到数据如果会发生变化,那还是独立缓存服务管理性更强,而且如果数据量特别大,独立缓存更容易扩展
异步查询优化
默认情况下,在 Flink 的 MapFunction 中,单个并行只能用同步方式去交互: 将请求 发送到外部存储,IO 阻塞,等待请求返回,然后继续发送下一个请求。这种同步交互的方式往往在网络等待上就耗费了大量时间。为了提高处理效率,可以增加 MapFunction 的并 行度,但增加并行度就意味着更多的资源,并不是一种非常好的解决方式

异步查询实际上是把维表的查询操作托管给单独的线程池完成,这样不会因为某一个查 询造成阻塞,单个并行可以连续发送多个请求,提高并发效率,这种方式特别针对涉及网络 IO 的操作,减少因为请求等待带来的消耗
原文链接:Flink实时数仓完结~
边栏推荐
- Flask框架——Sijax
- Desktop Software Development Framework Awards
- The truth of the industry: I will only test those that have no future, and I panic...
- UPC2022 Summer Individual Training Game 19 (B, P)
- redis6.0 源码学习(五)ziplist
- LeetCode二叉树系列——144.二叉树的最大深度
- EasyV数字孪生流域|宁波智慧水利整体智治综合应用
- 八年测试经验,为何惨遭领导痛批:你写的测试文档还不如刚来的应届生
- cookie模拟登录「建议收藏」
- 00后测试员摸爬滚打近一年,为是否要转行或去学软件测试的学弟们总结出了以下走心建议
猜你喜欢

LeetCode二叉树系列——102.二叉树的层序遍历

ROS 导航

Eight years of testing experience, why was the leader criticized: the test documents you wrote are not as good as those of fresh graduates

手把手教你写让人眼前一亮的软件测试简历,收不到面试邀请算我输
![[Advanced ROS] Lecture 11 Robot co-simulation based on Gazebo and Rviz (motion control and sensors)](/img/65/7bd87794ebde510ecfd1b0e4bd4c94.png)
[Advanced ROS] Lecture 11 Robot co-simulation based on Gazebo and Rviz (motion control and sensors)

Desktop Software Development Framework Awards

Remember an experience of interviewing an outsourcing company, should you go?

MPSK抗噪声性能对比(即MPSK标准误码率曲线)

CS内网横向移动 模拟渗透实操 超详细

LeetCode二叉树系列——199二叉树的右视图
随机推荐
这个编辑器居然号称快如闪电!
Baijiahao cancels the function of posting documents on the interface: the weight of the plug-in chain is blocked
Cookie simulation login "recommended collection"
Understand Chisel language. 28. Chisel advanced finite state machine (2) - Mealy state machine and comparison with Moore state machine
获取Google Advertising ID作为唯一识别码
A Small Case About Containers
地形分析的主要内容(流浪地球的特效水平)
开源工具推荐:高性能计算辅助工具MegPeak
CF780G Andryusha and Nervous Barriers
5. DOM
[C# 循环跳转]-C# 中的 while/do-while/for/foreach 循环结构以及 break/continue 跳转语句
CF1677E Tokitsukaze and Beautiful Subsegments
Container sorting case
mongodb打破原则引入SQL,它到底想要干啥?
The main content of terrain analysis (the special effect level of the wandering earth)
00 testers of seasoning after nearly a year, whether to change careers or to learn the software testing students summarized the following heart advice
Digital signal processing course lab report (what foundation is needed for digital signal processing)
【Vue.js 3.0源码】KeepAlive 组件:如何让组件在内存中缓存和调度?
【元胞自动机】基于元胞自动机模拟生命演化、病毒感染等实例附matlab代码
5. DOM