【实时数仓】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存储过程,触发器,支持标准数据库事务 ...
随机推荐
- 2.云原生之Docker容器环境安装实践
转载自:https://www.bilibili.com/read/cv15181036/?from=readlist 官方一键安装脚本 补充时间:[2020年4月22日 11:00:59] 一键安装 ...
- docker bridge 到 k8s pod 跨节点网络通信机制演进
- java基础二、类与继承
员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...
- 如何通过执行SQL为低代码项目提速?
见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速. 背景 自从计算机诞生的一刻起,如何让计算机能够按 ...
- Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo
前言 上一篇的demo使用隐藏js代码的方式,实现了一个饼图的基本交互方式,并预留了Qt模块对外的基础接口. 本篇的demo实现了自动排序的柱状图,实现了一个自动排序柱状图的基本交互方式,即Qt ...
- .Net CLR GC plan_phase二叉树和Brick_table
楔子 别那么懒,勤快点.以下取自CLR PreView 7.0. 主题 GC计划阶段(plan_phase)主要就两个部分,一个是堆里面的对象构建一颗二叉树(这颗二叉树的每个节点包含了诸如对象移动信息 ...
- cf1082 A. Vasya and Book
中文题意: 思路:我们先看看能不能直接从x翻到y,abs(y-x)%d==0,可以就直接输出abs(y-x)/d咯,不行的话之后有2种操作 1.先翻回到第一页,从第一页看看能不能范到y,不能的话翻到最 ...
- MatrixOne从入门到实战04——MatrixOne的连接和建表
MatrixOne从入门到实战--MatrixOne的连接和建表 前景回顾 前几篇文章,为大家介绍了MatrixOne这个产品,以及编译.部署MatrixOne的服务. 直通车: MatrixOne从 ...
- mybatis框架图
- Java并发编程 | Synchronized原理与使用
Java提供了多种机制实现多线程之间有需要同步执行的场景需求.其中最基本的是Synchronized ,实现上使用对象监视器( Monitor ). Java中的每个对象都是与线程可以锁定或解锁的对象 ...