实时数据仓库
1 为什么选择kafka?
① 实时写入,实时读取
② 消息队列适合,其他数据库受不了
2 ods层
1)存储原始数据
埋点的行为数据 (topic :ods_base_log)
业务数据 (topic :ods_base_db)
2)业务数据的有序性: maxwell配置,指定生产者分区的key为 table
3 dwd+dim层
① 事实表存Kafka
② 维度表存Hbase,基于热存储加载维表的join方案:
随机查长远考虑适合实时读写
DIM:事实数据根据维度ID查询相应的维度数据
HBase:√Redis:用户表数据量大,内存使用量太大HDFS(Hive):太慢,效率低Mysql:维表数据属于业务库,实时计算查询MySQL会给业务库增加压力--从库 √ClickHouse:QPS高、列存
3.1 动态分流
将事实表写入kafka的dwd层,将维度表写入hbase。为了避免因表的变化而重启Flink任务,在mysql存一张表来动态配置。
DIM层编程:
1.消费Kafka topic_db主题数据(包含所有的业务表数据)2.过滤维表数据(根据表名做过滤)3.将数据写入Phoenix(每张维表对应一张Phoenix表)
按照当前的思路,如果增加一张维表,需要修改代码,重新编译,关闭以前的程序并启动新程序!
讨论1:如何做到只重启,不修改代码?
读配置文件(Mysql,Redis,HBase):只在启动的时候加载
讨论2:如何做到不重启?
动态加载:
1、 每隔一段时间自动加载(Java中的定时任务) 定时任务写于open方法中
2、 实时监控抓取配置信息数据:
① 配置信息写到MySQL --> FlinkCDC抓取② 配置信息写到File --> Flume+Kafka+Flink消费③ 广播流+connect:广播状态大小问题 √④ Keyby+connect:容易数据倾斜
FlinkCDC实时抓取MySQL内配置信息:
① 读取一张配置表 ② 维护这张配置表: source来源 sink写到哪 操作类型 字段 主键 扩展③ 实时获取配置表的变化 ④ CDC工具 -- FlinkCDC⑤ 使用了SQL的方式,去同步这张配置表,SQL的数据格式比较方便
扩展思路:推送的方式,ZK通知机制
3.2 怎么写HBase
① 借助phoenix
② 没有做维度退化,维表数据量小、变化频率慢
③ 最大的维表:用户维表,百万日活,2000万注册用户为例,1条平均1k:2000万*1k=约20G,使用Phoenix创建的盐表,避免数据热点问题 – https://developer.aliyun.com/article/532313
4 dwm层
4.1 为什么要加一个dwm层?
DWM层主要服务DWS,因为部分需求直接从DWD层到DWS层中间会有一定的计算量,而且这部分计算的结果很有可能被多个DWS层主题复用,所以部分DWD层会形成一层DWM。
– 访问UV计算
– 跳出明细计算
– 订单宽表
– 支付宽表
4.2 事实表与事实表join
① 事实表与事实表的双流Join,使用了Interval Join
② Join不上的数据怎么办?
在Flink中的流join大体分为两种 ,一种是基于时间窗口的join(Time Windowed Join),比如join、coGroup等。另一种是基于状态缓存的Join(Temporal Table Join),比如IntervalJoin。
IntervalJoin相比较窗口join,IntervalJoin使用更简单,而且避免了应该匹配的数据处于不同窗口的问题。intervalJoin目前只有一个问题,就是还不支持left join。
由于订单主表与订单从表之间的关联不需要left join,所以intervalJoin是较好的选择。
4.3 事实表与维度表join
维度关联采用了热存储加载的join方案,实际上就是在流中查询存储在hbase中的数据表。但是即使通过主键的方式查询,hbase速度的查询也是不及流之间的join。外部数据源的查询常常是流式计算的性能瓶颈,所以在这个基础上还能进行一定的优化。
1)旁路缓存模式
旁路缓存模式是一种非常常见的按需分配缓存的模式。 如图,任何请求优先访问缓存,缓存命中,直接获得数据返回请求。如果未命中则查询数据库,同时把结果写入缓存以备后续请求使用。

2)异步IO
Flink 在1.2中引入了Async I/O,在异步模式下,将IO操作异步化,单个并行可以连续发送多个请求,哪个请求先返回就先处理,从而在连续的请求间不需要阻塞式等待,大大提高了流处理效率。
Async I/O 是阿里巴巴贡献给社区的一个呼声非常高的特性,解决了与外部系统交互时网络延迟成为了系统瓶颈的问题。

异步查询实际上是把维表的查询操作托管给单独的线程池完成,这样不会因为某一个查询造成阻塞,单个并行可以连续发送多个请求,提高并发效率。
这种方式特别针对涉及网络IO的操作,减少因为请求等待带来的消耗。
4.4 怎么保证缓存一致性
当我们获取到维表更新的数据,也就是拿到维度表操作类型为update时:
1)更新Hbase的同时,删除redis里对应的之前缓存的数据
2)redis设置了过期时间:24小时
5 dws层
5.1 为什么选择ClickHouse
1)适合大宽表、数据量多、聚合统计分析 =》 快
2)宽表已经不再需要join,很合适
5.2 轻度聚合
1)DWS层要应对很多实时查询,如果是完全的明细那么查询的压力是非常大的。将更多的实时数据以主题的方式组合起来便于管理,同时也能减少维度查询的次数。
2)开一个小窗口,5s的滚动窗口
3)同时减轻了写ClickHouse的压力,减少后续聚合的时间
4)几张表? 表名、字段
访客、商品、地区、关键词
6 ads层
6.1 实现方案
为可视化大屏服务,提供一个数据接口用来查询ClickHouse中的数据。

6.2 怎么保证ClickHouse的一致性?
ReplacingMergeTree只能保证最终一致性,查询时的sql语法加上去重逻辑
7 监控
Prometheus + Grafana
相关文章:
实时数据仓库
1 为什么选择kafka? ① 实时写入,实时读取 ② 消息队列适合,其他数据库受不了 2 ods层 1)存储原始数据 埋点的行为数据 (topic :ods_base_log) 业务数据 (topic :ods_base_db) 2)业务数据的有序性&#x…...
leetcode 1250. 检查「好数组」
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。 示例 1&…...
JDK动态代理和CGLib动态代理的区别
原文网址:JDK动态代理和CGLib动态代理的区别_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中JDK动态代理和CGLib动态代理的区别。 区别概述 项 JDK动态代理 CGLIB动态代理 接口是否需实现 只能代理实现了接口的类。 可以代理没有实现接口的类。 原理 继承…...
Leetcode.1250 检查「好数组」
题目链接 Leetcode.1250 检查「好数组」 Rating : 1983 题目描述 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「…...
WMS系统推荐,如何选到适合企业的仓库管理系统
市场上有很多WMS系统,但是现在很多仓库管理系统都在使用WMS系统。那么在选择WMS系统时应该考虑什么呢?明确业务发展特征,准确表达能力目标许多物流企业在选择物流管理系统时,往往会被物流管理系统的整体系统所迷惑,在功…...
C语言的期末复习
🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢&a…...
强化学习之DQN论文介绍
强化学习之DQN论文介绍DQN摘要介绍问题特点经验回放相关工作实验算法流程结论DQN 摘要 1.基于Q-learning从高维输入学习到控制策略的卷积神经网络。 2.输入是像素,输出是奖励函数。 3.主要训练、学习Atari 2600游戏,在6款游戏中3款超越人类专家。 介绍 …...
使用luaBridge添加自己的C++脚本插件能力
概述 如果我们有一个应用需要频繁的更改业务逻辑,但是基础功能不变,那么我们可以将基础功能作为底层接口,上层的功能按照脚本方式来编写。很多插件都这样的原理,比如我们的浏览器的JS就这样,小程序也是这样的原理,我们使用C++也很容易实现这样的功能。 lua是最小最精致的…...
再拾起博客
一切要从去年12月27日被裁员的那天说起。 那天是星期二,和平常一样,8点20的闹钟响起,但我习惯性的磨蹭到8点40起床,洗漱完成后9点过几分出门,骑车20多分钟几乎是踩点到的公司,正当我坐在工位准备平复心情切…...
Mybatis流式游标查询-大数据DB查询OOM查询问题
问题场景Mysql数据处理类型分以下三种com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存com.mysql.cj.protocol.a.result.ResultsetRowsCursor:游标查询,将结果集分批拉取到内存&#x…...
以before为例 完成一个aop代理强化方法案例
观看本文 首先 您需要做好Spring aop的准备工作 具体可以参考我的文章 java Spring aop入门准备工作 首先 我们创建一个包 我这里叫 Aop 然后在Aop包下创建一个类 叫 User 参考代码如下 package Aop;public class User {public void add(){System.out.println("add....…...
好记性不如烂笔头之Java基础复习笔记
未完待续。。。 代码块先于构造方法执行,不管类中有多少个代码块,都会先将所有代码块执行完再执行构造方法和其他方法。类中如果没有自定义的构造方法,那么JVM会提供默认的无参构造方法;如果类中有自定义的构造方法,那…...
MyBatisPlus
这里写目录标题1.MyBatisPlus概述2.MyBatisPlus的开发步骤2.1 MyBatisPlus的CRUD操作2.2 MyBatisPlus的分页查询3.MyBatisPlus的DQL编程控制(封装sql)3.1 条件查询方式3.1.1 条件查询3.1.2 组合条件3.1.3 Null值处理3.2 查询投影-设置【查询字段、分组、分页】3.2.1 查询结果包…...
【C语言】编程初学者入门训练(11)
文章目录101. 矩阵相等判定102. 上三角矩阵判定103. 矩阵转置104. 矩阵交换105. 杨辉三角106. 井字棋107. 小乐乐与进制转换108. 小乐乐求和109. 小乐乐定闹钟110. 小乐乐排电梯101. 矩阵相等判定 问题描述:KiKi得到了两个n行m列的矩阵,他想知道两个矩阵…...
HTTP 1.1响应码
HTTP 1.1响应码 响应码和信息含义HttpURLConnection1XX信息100 Continue服务器准备接受请求主体,客户端应当发送请求主体;这允许客户端在请求中发送大量数据之前询问服务器是否将接受请求N/A101 Switching Protocols服务器接受客户端在Upgrade首部字段中…...
常用设计模式介绍
java设计模式类型创建型模式:将对象的创建与使用分离结构型模式:如何将类和对象按照某种布局组成更大的格局行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务23种设计模式介绍1.单例(Singleton&…...
关于货物物品横竖摆放的问题
货车内宽是2.4米。考虑到最多装载,长宽130100的货品,应该横竖摆放。 横竖摆放的数量如何自动计算呢? 采用数学公式,计算如下: 横向摆放数(int)(横长竖高)*数量/4/横长 竖向摆放数数量-横向摆放数 结果如下&#x…...
人员定位需求多,场景目标各不同
GPS技术为现代人带来了许多便利,也提供了诸多基于位置的新型服务。随着科技的发展,人员位置信息在如今的生产生活中也越发重要起来。因此,不同行业领域开始关注人员定位,尤其关注室内人员定位。室内人员定位需求从目的性出发&…...
怎么解决首屏加载速度过慢的问题
怎么解决首屏加载速度过慢的问题首屏加载速度指的是什么?解决方法首屏加载速度指的是什么? 首屏加载速度指的是浏览器从响应用户输入网站地址到首屏内容渲染完成的时间。值得注意的是此时整个网页不一定要全部渲染完成,只需展示当前视窗所需要…...
3d视觉相关论文阅读目录汇总
目录3d视觉综述论文 Deep Learning for 3D Point Clouds: A Survey 基础概念 3d目标检测常见基础概念 3d目标检测 & 自动驾驶 数据集 3d目标检测数据集介绍(数据格式,保存形式,适配算法库等) KITTI数据集 Waymo数据集 nu…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
