一、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. 2.云原生之Docker容器环境安装实践

    转载自:https://www.bilibili.com/read/cv15181036/?from=readlist 官方一键安装脚本 补充时间:[2020年4月22日 11:00:59] 一键安装 ...

  2. docker bridge 到 k8s pod 跨节点网络通信机制演进

  3. java基础二、类与继承

    员工类 Employee, 经理类:Manager public class Employee { private String name; private double salary; privat ...

  4. 如何通过执行SQL为低代码项目提速?

    见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速. 背景 自从计算机诞生的一刻起,如何让计算机能够按 ...

  5. Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo

    前言   上一篇的demo使用隐藏js代码的方式,实现了一个饼图的基本交互方式,并预留了Qt模块对外的基础接口.  本篇的demo实现了自动排序的柱状图,实现了一个自动排序柱状图的基本交互方式,即Qt ...

  6. .Net CLR GC plan_phase二叉树和Brick_table

    楔子 别那么懒,勤快点.以下取自CLR PreView 7.0. 主题 GC计划阶段(plan_phase)主要就两个部分,一个是堆里面的对象构建一颗二叉树(这颗二叉树的每个节点包含了诸如对象移动信息 ...

  7. cf1082 A. Vasya and Book

    中文题意: 思路:我们先看看能不能直接从x翻到y,abs(y-x)%d==0,可以就直接输出abs(y-x)/d咯,不行的话之后有2种操作 1.先翻回到第一页,从第一页看看能不能范到y,不能的话翻到最 ...

  8. MatrixOne从入门到实战04——MatrixOne的连接和建表

    MatrixOne从入门到实战--MatrixOne的连接和建表 前景回顾 前几篇文章,为大家介绍了MatrixOne这个产品,以及编译.部署MatrixOne的服务. 直通车: MatrixOne从 ...

  9. mybatis框架图

  10. Java并发编程 | Synchronized原理与使用

    Java提供了多种机制实现多线程之间有需要同步执行的场景需求.其中最基本的是Synchronized ,实现上使用对象监视器( Monitor ). Java中的每个对象都是与线程可以锁定或解锁的对象 ...