【实时数仓】Day03-DWM 层业务:各层的设计和常用信息、访客UV计算、跳出明细计算(CEP技术合并数据识别)、订单宽表(双流合并,事实表与维度数据合并)、支付宽表
一、DWS层与DWM层的设计
1、设计思路
分流到了DWD层,并将数据分别出传入指定的topic

规划需要实时计算的指标,形成主题宽表,作为DWS层
2、需求梳理


DWM 层主要服务 DWS,因为部分需求从 DWD 层到DWS 层中间会有一定的计算量,这部分计算的结果很有可能被多个 DWS 层主题复用,
所以部分 DWD层后面会形成一层 DWM
主要的DWM层业务包括:访客UV(独立访客、日活用户)计算、跳出明细计算、订单宽表、支付宽表
二、DWM层-访客UV计算
1、需求分析
UV,全称是 Unique Visitor,即独立访客,对于实时计算中,也可以称为 DAU(Daily Active User),即每日活跃用户【日活】
识别:是访客打开的第一个页面,一天的范围内去重
2、实现过程
(1)从 Kafka 的 dwd_page_log 主题接收数据,得到JSONObject格式的DataSource
(2)对数据过滤
按照mid分组,记录用户进入时间
重写open初始化状态,重写filter实现过滤【last_page_id 不为空,并且lastVisitDate 是今天】,设置1天的过期时间
过滤后的数据写入dwm_unique_visit
三、DWM 层-跳出明细计算
1、跳出
(1)访问完某页面就退出
关注跳出率可以查看引流过来的访客能否被吸引
(2)识别跳出行为
是用户访问的第一个页面(是否有上一个访问的页面last_page_id )
一段时间内,用户不再访问其他页面
(3)组合判断存在数据+后续一段时间内不存在的数据
使用Flink 自带的 CEP 技术(适合通过多条数据组合来识别某个事件)
跳出事件的本质:条件事件+超时事件的组合
2、实现
(1)从 Kafka 的 dwd_page_log 主题读取页面日志
(2)通过CEP完成跳出判断
设定时间语义为事件时间,选取ts作为事件事件
按日志数据的mid进行分组,得到每隔mid的数据流<JSONObject, String>
配置CEP表达式:lastPageId == null || lastPageId.length() <= 0;【表示没有后续访问的页面】
根据表达式筛选流CEP.pattern(keyedStream, pattern);
设置超时时间标识timeoutTag,实现 PatternFlatTimeoutFunction 中的 timeout 方法
超时数据打上标记,flatSelect提取匹配数据,SideOutput侧输出流输出超时数据
getSideOutput(outputTag)与匹配数据做union连接,即selectDS.union(userJumpDetailDS);
四、订单宽表
1、需求分析
围绕订单有很多的维度统计需求,比如用户、地区、商品、品类、品牌等等

之前进行了拆分,维度表在HBASE中,事实数据进入kafka的DWD层
需要两种关联:事实表之间的流关联,事实表与维度表之间(在流计算中查询数据源)
2、订单表和订单明细表关联
创建实体类,接收订单和订单明细表数据
在配置表中进行配置sink表名及字段名
两表关联,实现双流join(基于时间窗口和基于状态缓存,选用后者中的intervalJoin)
orderInfoWithIdKeyedStream.intervalJoin(orderDetailWithOrderIdKeyedStream)
创建合并后的宽表实体类
3、维度表关联
(1)实现内容:在流中查询存储在 HBase 中的数据表
(2)编写Phoneix的工具类和封装查询维度的工具类DimUtil
(3)查询维度数据,运行main方法测试
(4)优化1:旁路缓存模式
加入旁路缓存模式,可以使用堆缓存或者独立缓存服务(redis,memcache)
采用redis管理型更强

封装 RedisUtil,通过连接池获得 Jedis
在 DimUtil 中加入缓存,如果缓存没有再从的 Phoenix 查询
增加失效缓存方法及数据变化时的invoke 方法
(5)优化2:异步查询
默认只能同步方式交互,耗费了大量时间
使用Flink的Async I/O异步交互
封装线程工具类,自定义维度查询接口
使用时选择的两个方法:有序等待和无序等待
分别实现在维度表中关联用户维度、省市维度、SKU维度、SPU维度、商品维度、品类维度
(6)将结果写入kafka sink
五、DWM 层-支付宽表
1、需求分析
支付表没有到订单明细,支付金额没有细分到商品上
要把支付表的信息与订单宽表关联上,以统计各个商品的支付情况
思路:用流的方式接收订单宽表,然后用双流 join 方式进行合并,用 intervalJoin 来管理流的状态时间,保证当支付到达时订单宽表还保存在状态中。
2、功能实现
创建支付表、订单宽表实体类,并读取对应topic
数据转化为bean,提取时间戳生成WaterMark水位线
按订单id分组,进行双流join
六、总结
1、DWD层和DWM层的任务
DWD层:把一种明细转换为另一种明细,以应对后续的统计
DWM层:把需要多次使用的中间结果保存,避免重复运算()
2、应当掌握
利用状态(state)进行去重操作-(访客UV计算)
利用CEP对一组数据进行筛选判断(跳出行为计算)
使用 intervalJoin 处理流 join
维度关联处理,并通过缓存和异步查询对性能进行优化
【实时数仓】Day03-DWM 层业务:各层的设计和常用信息、访客UV计算、跳出明细计算(CEP技术合并数据识别)、订单宽表(双流合并,事实表与维度数据合并)、支付宽表的更多相关文章
- 基于 Flink 的实时数仓生产实践
数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战.在智能商业中,数据的结果代表了用户反馈.获取数据的及时性尤为重要.快速获取数据反馈能够帮助公司更快地做出决策,更好地进行 ...
- 实时数仓(二):DWD层-数据处理
目录 实时数仓(二):DWD层-数据处理 1.数据源 2.用户行为日志 2.1开发环境搭建 1)包结构 2)pom.xml 3)MykafkaUtil.java 4)log4j.properties ...
- 大数据之Hudi + Kylin的准实时数仓实现
问题导读:1.数据库.数据仓库如何理解?2.数据湖有什么用途?解决什么问题?3.数据仓库的加载链路如何实现?4.Hudi新一代数据湖项目有什么优势? 在近期的 Apache Kylin × Apach ...
- 美团点评基于 Flink 的实时数仓建设实践
https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...
- flink实时数仓从入门到实战
第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...
- HBase实战 | 知乎实时数仓架构演进
https://mp.weixin.qq.com/s/hx-q13QteNvtXRpNsE5Y0A 作者 | 知乎数据工程团队编辑 | VincentAI 前线导读:“数据智能” (Data Inte ...
- (转)用Flink取代Spark Streaming!知乎实时数仓架构演进
转:https://mp.weixin.qq.com/s/e8lsGyl8oVtfg6HhXyIe4A AI 前线导读:“数据智能” (Data Intelligence) 有一个必须且基础的环节,就 ...
- 基于Flink构建全场景实时数仓
目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...
- 基于 Kafka 的实时数仓在搜索的实践应用
一.概述 Apache Kafka 发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka 社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得 ...
- 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...
随机推荐
- 【微服务】- 配置中心 - Nacos
微服务 - 配置中心 - Nacos 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 今天的学习任务就是学习使用Nacos作为配置中心. 努力克制自己,拒绝摆烂! 什么是配 ...
- tcp_tw_recycle参数引发的故障
文章转载自:https://blog.csdn.net/wireless_tech/article/details/6405755 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反 ...
- Docker安装prometheus
# 拉取镜像 docker pull prom/prometheus:v2.22.0 # 创建配置文件 mkdir -p /opt/prometheus/ cd /opt/prometheus vim ...
- DevExpress弹框、右键菜单、Grid的使用
很重要!!!Dev为了区分winform的命名,会把一些新添加的属性放在Properties对象里!!找不到想要的属性,记得到里面找找哦! 一.下拉框 在这里假设我们的数据源是db.List(),在这 ...
- SqlKata - 方便好用的 Sql query builder
SqlKata查询生成器是一个用C# 编写的功能强大的Sql查询生成器.它是安全的,与框架无关.灵感来源于可用的顶级查询生成器,如Laravel Query Builder和 Knex. SqlKat ...
- windows C++ call ADB command
提供两种方式: 1.Windows API 2.Windows _popen // ADBHelper.cpp : This file contains the 'main' function. Pr ...
- 非swoole的方式实现简单的异步(nginx模式下)
set_time_limit(0);echo '任务开始'.time();/*即时打印*/register_shutdown_function([$this, "test"]);/ ...
- 如何用webgl(three.js)搭建一个3D库房,3D仓库3D码头,3D集装箱,车辆定位,叉车定位可视化孪生系统——第十五课
序 又是快两个月没写随笔了,长时间不总结项目,不锻炼文笔,一开篇,多少都会有些生疏,不知道如何开篇,如何写下去.有点江郎才尽,黔驴技穷的感觉. 写随笔,通常三步走,第一步,搭建框架,先把你要写的内容框 ...
- GCC 指令详解及动态库、静态库的使用
GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...
- 蓝桥杯赛前复习C++
C标准库常用函数 memset函数:暴力清空 void *memset(void *str, int c, size_t n) str -- 指向要填充的内存块. c -- 要被设置的值.该值以 in ...