【实时数仓】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存储过程,触发器,支持标准数据库事务 ...
随机推荐
- 日志收集工具 Fluentd 使用教程
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247499829&idx=1&sn=1f92daa88d ...
- centos7.9使用yum方式安装MongoDB 5.x
1.配置阿里云yum仓库 #vim /etc/yum.repos.d/mongodb-org-5.0.repo [mngodb-org] name=MongoDB Repository baseurl ...
- Solutions:网站搜索 - Elastic Site Search
- traefik的80和443端口占用进一步分析
上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html 建议先看上一篇文章,才更容易理解这篇 1.traefik的deployment ...
- LINUX 新增的磁盘不建立分区,直接建立文件系统并挂载
假设新硬盘是 /dev/sdc fdisk操作的是/dev/sdc ,分区后才会有/dev/sdc1 /dev/sdc2 之类 一般mkfs.ext4 /dev/sdc1 来格式化一个分区,再moun ...
- 如何调试 Docker
开启 Debug 模式 在 dockerd 配置文件 daemon.json(默认位于 /etc/docker/)中添加 { "debug": true } 重启守护进程. $ s ...
- 前端枚举enum的应用(Element)封装
什么是枚举Enum 枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有).用来表示一些特定类别的常量数据,如性别.学历.方向.账户状态等,项目开发中是 ...
- uoj348【WC2018】州区划分
题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...
- JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...
- 靶机: medium_socnet
靶机: medium_socnet 准备工作 需要你确定的事情: 确定 kali 已经安装,并且能正常使用[本文不涉及 kali 安装配置] VirtualBox 以前能正常导入虚拟文件 ova 能正 ...