【实时数仓】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存储过程,触发器,支持标准数据库事务 ...
随机推荐
- 把train数据集生成txt(test同理)
import cv2 import numpy as np import os import sys import pickle data_dir = os.path.join("./&qu ...
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
TCP和UDP的区别 TCP是一个面向连接的.可靠的.基于字节流的传输层协议. 而UDP是一个面向无连接的传输层协议. 具体来分析,和 UDP 相比,TCP 有三大核心特性: 面向连接:所谓的连接,指 ...
- 详解ROMA Connect API 流控实现技术
摘要:本文将详细描述API Gateway流控实现,揭开高性能秒级流控的技术细节. 1.概述 ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务 ...
- 手写自定义springboot-starter,感受框架的魅力和原理
一.前言 Springboot的自动配置原理,面试中经常问到,一直看也记不住,不如手写一个starter,加深一下记忆. 看了之后发现大部分的starter都是这个原理,实践才会记忆深刻. 核心思想: ...
- git clone开启云上AI开发
摘要:相比于传统的软件开发,AI开发存在以下4个痛点:算法繁多:训练时间长:算力需求大:模型需手动管理,我们可以使用云上AI开发的方式来缓解以上4个痛点. 本文分享自华为云社区<git clon ...
- 齐博x1标签实例:做模板组图单图无图混排的处理
代码如下, {qb:tag name="xxx" type="cms" rows="10"} {if ( count($rs['picurl ...
- 8.pygame-定时器
使用定时器添加敌机 游戏启动后,每隔一秒出现一架敌方飞机 每架飞机向屏幕下方飞行,速度各不相同 没加敌机出现的水平位置也不进相同 当敌机从屏幕下方飞出,不会再飞回到屏幕中 定时器 pygame中使 ...
- SQL--Row_Number() over()的使用
1.语法 --over里面有两个参数 --partition by 用于分割区域 此参数可选 --order by 用于排序 此参数必有 row_number() over(partition by ...
- 每日算法3:随机生成五个不同整数,将数字转换为RMB格式
随机生成五个不同整数 点击查看代码 /* 题目解析: 1.采用Math对象的random()方法, 2.将每次生成的数跟之前的数判断相等则此次生成无效i-- */ function randomNum ...
- ubuntu 基本指令
系统相关 df: disk free 用以显示系统上文件系统磁盘的使用情况 # 以M/G单位显示硬盘空间大小 df -h apt: advanced packaging tool 包管理工具 apt ...