一、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. 日志收集工具 Fluentd 使用教程

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247499829&idx=1&sn=1f92daa88d ...

  2. centos7.9使用yum方式安装MongoDB 5.x

    1.配置阿里云yum仓库 #vim /etc/yum.repos.d/mongodb-org-5.0.repo [mngodb-org] name=MongoDB Repository baseurl ...

  3. Solutions:网站搜索 - Elastic Site Search

  4. traefik的80和443端口占用进一步分析

    上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html 建议先看上一篇文章,才更容易理解这篇 1.traefik的deployment ...

  5. LINUX 新增的磁盘不建立分区,直接建立文件系统并挂载

    假设新硬盘是 /dev/sdc fdisk操作的是/dev/sdc ,分区后才会有/dev/sdc1 /dev/sdc2 之类 一般mkfs.ext4 /dev/sdc1 来格式化一个分区,再moun ...

  6. 如何调试 Docker

    开启 Debug 模式 在 dockerd 配置文件 daemon.json(默认位于 /etc/docker/)中添加 { "debug": true } 重启守护进程. $ s ...

  7. 前端枚举enum的应用(Element)封装

    什么是枚举Enum 枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有).用来表示一些特定类别的常量数据,如性别.学历.方向.账户状态等,项目开发中是 ...

  8. uoj348【WC2018】州区划分

    题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...

  9. JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域

    文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...

  10. 靶机: medium_socnet

    靶机: medium_socnet 准备工作 需要你确定的事情: 确定 kali 已经安装,并且能正常使用[本文不涉及 kali 安装配置] VirtualBox 以前能正常导入虚拟文件 ova 能正 ...