一、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. Traefik 控制面板 SaaS 服务 Pilot

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247485572&idx=1&sn=8ffa2bc7 ...

  2. 使用SpringCloud实现的微服务软件开发部署到Linux上占用内存过大问题解决办法

    问题描述 最近上线的一个使用JAVA的Spring Cloud开发的ERP软件,部署上线时发现很严重的内存资源占用过高问题,而实际上开发测试并没有很大的访问量,甚至却出现了服务器无法正常访问的现象. ...

  3. 安装ceph (快速) 步骤三: Ceph 客户端

    大多数 Ceph 用户不会直接往 Ceph 存储集群里存储对象,他们通常会使用 Ceph 块设备. Ceph 文件系统.或 Ceph 对象存储这三大功能中的一个或多个. 前提条件 先完成存储集群快速入 ...

  4. 7.nexus版本升级

    nexus-3.14.0升级到3.15.2 首先来看下原来的服务目录: nexus-3.14.0-04 sonatype-work 注意:nexus-3.14.0-04是应用程序包,sonatype- ...

  5. 微信小程序实现与登录

    一.小程序的实现原理 在小程序中,渲染层和逻辑层是分开的,双线程同时运行,渲染层和逻辑层这两个通信主体之间的通讯以及通讯主体与第三方服务器之间的通信,都是通过微信客户端进行转发.小程序启动运行两种情况 ...

  6. HDU2586 How far away ? (树链剖分求LCA)

    用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...

  7. Java中的多线程的创建方式

    首先理清几个基本概念: 程序:为完成特定任务,用某种语言编写的一组指令的集合.即一段静态的代码(还没运行起来) 进程:是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源 ...

  8. SQL基础语句入门

    SQL语句入门 起因 学校开设数据库相关的课程了,打算总结一篇关于基础SQL语句的文章. SQL介绍 SQL最早版本是由IBM开发的,一直发展到至今. SQL语言有如下几个部分: 数据定义语言DDL: ...

  9. 解决console控制台反复打印“WebSocket connection to ws://localhost:9528/sockjs-node/107/uadaszgz.websocket failed:Invalid frame header

    element-admin-vue 项目console台一直报websocket连接失败 解决办法 1.vue.config.js中配置devServer.proxy的ws为false  (我没成功) ...

  10. Windows活动目录_票据——敬请期待!

    票据:域控&域机子之间的信任密钥 [缺省40天更换一次] 域用户登录过程 域用户的账户密码(用信任密钥加密的)传递至域控: 域控验证账户密码成功后,构造域用户SID和组SID(用信任密钥加密的 ...