一、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. 查看docker程序使用的内存脚本

    #!/bin/bash # 找出所有运行的容器 idNames=`docker ps --format "{{.ID}}|{{.Names}},"` # 按,号分隔 OLD_IFS ...

  2. Elasticsearch删除操作详解

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484022&idx=1&sn=7a4de21 ...

  3. FastDFS 分布式文件系统的安装与使用---两台服务器搭建FastDFS环境

    写在前面 有不少小伙伴在实际工作中,对于如何存储文件(图片.视频.音频等)没有一个很好的解决思路.都明白不能将文件存储在单台服务器的磁盘上,也知道需要将文件进行副本备份.如果自己手动写文件的副本机制, ...

  4. do...while循环体

    基本语法 不要忘记while()后还需要加分号!!! 例(输出五句hello): int i = 1; //循环变量初始化 int max = 5; //循环的最大次数 do{ printf(&quo ...

  5. VMware安装Win11+WSA子系统和使用教程

    VMware安装Win11+WSA子系统和使用教程 作者:Sna1lGo 时间:2022/9/29 下载相关文件: Win11镜像:Download Windows 11 (microsoft.com ...

  6. 关于aws账单数据中几个重要的与费用相关的字段的意义分析

    今天在看aws账号的详细信息时,看到字段很多,大多数字段,根据名称可以知道代表的意义 对于如下几个字段的概念有点模糊(位于"UsageStartDate","UsageE ...

  7. 220726 T1 树染色问题 (树的直径)

    题目描述 高钧在校园中漫步时,经过了一棵树.这时,几个同学突然冒出来控制住了他. 这棵树有 nn 个节点, 每个节点有黑白两种颜色, 为了更好的 alb , 需要把所有节点染成同一种颜色. 为了更好的 ...

  8. printf-库函数重定向、重载

    重定向:这是针对标准C语言语法来讲,指的是我们可以重新声明库函数并定义库函数的执行体 重载:这是CPP引入的新特性,即根据函数不同参数个数或参数类型来对同一函数名进行不同定义 C和CPP对重定向处理机 ...

  9. Hbase创建表参数说明

    Hbase创建表操作及参数说明 1.创建命名空间 create_namespace 'test' 2.创建user表,列族:info create 'test:user', 'info' 3.查看表结 ...

  10. MySQL之安装(linux两种版本版本安装)

    LinuxMySQL安装(Mysql5.5版本) 第一种 有安装包的安装方式 1.下载地址: http://dev.mysql.com/downloads/mysql 2.检查当前系统是否安装过mys ...