一、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技术合并数据识别)、订单宽表(双流合并,事实表与维度数据合并)、支付宽表的更多相关文章

  1. 基于 Flink 的实时数仓生产实践

    数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战.在智能商业中,数据的结果代表了用户反馈.获取数据的及时性尤为重要.快速获取数据反馈能够帮助公司更快地做出决策,更好地进行 ...

  2. 实时数仓(二):DWD层-数据处理

    目录 实时数仓(二):DWD层-数据处理 1.数据源 2.用户行为日志 2.1开发环境搭建 1)包结构 2)pom.xml 3)MykafkaUtil.java 4)log4j.properties ...

  3. 大数据之Hudi + Kylin的准实时数仓实现

    问题导读:1.数据库.数据仓库如何理解?2.数据湖有什么用途?解决什么问题?3.数据仓库的加载链路如何实现?4.Hudi新一代数据湖项目有什么优势? 在近期的 Apache Kylin × Apach ...

  4. 美团点评基于 Flink 的实时数仓建设实践

    https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...

  5. flink实时数仓从入门到实战

    第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...

  6. HBase实战 | 知乎实时数仓架构演进

    https://mp.weixin.qq.com/s/hx-q13QteNvtXRpNsE5Y0A 作者 | 知乎数据工程团队编辑 | VincentAI 前线导读:“数据智能” (Data Inte ...

  7. (转)用Flink取代Spark Streaming!知乎实时数仓架构演进

    转:https://mp.weixin.qq.com/s/e8lsGyl8oVtfg6HhXyIe4A AI 前线导读:“数据智能” (Data Intelligence) 有一个必须且基础的环节,就 ...

  8. 基于Flink构建全场景实时数仓

    目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...

  9. 基于 Kafka 的实时数仓在搜索的实践应用

    一.概述 Apache Kafka 发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka 社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得 ...

  10. 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读

    阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...

随机推荐

  1. Kubernetes 版本升级之路

    把一个集群从1.22版升级到1.23版. 前提条件 确保备份所有重要组件,例如存储在数据库中的应用状态.Kubernetes 升级不涉及正常的工作负载,只涉及与 Kubernetes 相关的组件,但备 ...

  2. MinIO多租户(Multi-tenant)部署指南

    官方文档地址:http://docs.minio.org.cn/docs/master/multi-tenant-minio-deployment-guide 单机部署 在单台机器上托管多个租户,为每 ...

  3. 官方使用logstash同步Mysql数据表到ES的摘抄

    官方文档地址:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html#plugins-inputs-jdbc ...

  4. 【golang】json数据解析 - 嵌套json解析

    @ 目录 1. 通过结构体映射解析 2. 嵌套json解析-map 1. 通过结构体映射解析 原数据结构 解析 // 结构体 type contractJson struct { Data []tra ...

  5. 企业信息化建PLM系统、ERP系统、MES系统是单个逐步建设好,还是同时上比较好?

    企业信息化建PLM系统.ERP系统.MES系统肯定是单个逐步建设好啊,不仅仅是各个系统单独建设,系统内各模块的实施也应该先后逐步推进,切不可想着一口吃个大胖子,一股脑的全上,求全求快是很多系统实施失败 ...

  6. 改善C#程序的方法-1 操作字符串

    正确操作字符串 引言: 字符串是使用很频繁的一种数据类型. 如果使用不慎,则会为一次字符串操作所带来的额外性能开销而付出代价. 下面从这几个方面来探讨如何正确操作字符串: 1.确保尽量少的装箱,尽可能 ...

  7. 使用 Spring Security 手动验证用户

    1.概述 在这篇快速文章中,我们将重点介绍如何在 Spring Security 和 Spring MVC 中手动验证用户的身份. 2.Spring Security 简单地说,Spring Secu ...

  8. Oracle索引和事务

    1. 什么是索引?有什么用? 1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的目录.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即 ...

  9. 部署redis集群

    1.redis部署 redis单实例部署参考:https://www.cnblogs.com/silgen/p/16537299.html 版本:6.2.7 集群:6个节点(redis集群至少3个节点 ...

  10. Python学习之实例1

    一.求n个数字的平均值 n=3 #定义常量n=3 sum=0 #定义求和变量sum count=0 #定义变量count,记录输入数字的次数 print("请输入3个数字:") # ...