当前位置: 首页 > news >正文

实时数据仓库

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…...

WARPED框架:单目RGB驱动的机器人视觉运动策略学习

1. WARPED框架:单目RGB驱动的机器人视觉运动策略学习新范式在机器人模仿学习领域,如何高效获取高质量的示范数据一直是个核心挑战。传统方法通常需要昂贵的多视角相机阵列、深度传感器或专用硬件设备,这不仅增加了部署成本,更限制…...

开源项目metabase-mcp-server:用MCP协议连接Metabase与AI智能体,实现对话式数据分析

1. 项目概述:当开源BI工具遇上AI智能体如果你和我一样,在日常工作中既要用Metabase做数据可视化看板,又要和Claude、Cursor这类AI助手打交道,那你肯定也遇到过这样的痛点:想问问AI“上个月华东区的销售额趋势”&#x…...

CocoaPods终极版本管理指南:掌握语义化版本控制与依赖锁定策略

CocoaPods终极版本管理指南:掌握语义化版本控制与依赖锁定策略 【免费下载链接】CocoaPods The Cocoa Dependency Manager. 项目地址: https://gitcode.com/gh_mirrors/co/CocoaPods CocoaPods是iOS和macOS开发中最受欢迎的依赖管理器,它通过智能…...

PICAXE单片机驱动DS18B20温度传感器:从硬件连接到数据处理

1. 项目概述:用PICAXE玩转DS18B20数字温度传感器如果你手头有一块PICAXE单片机,想快速实现一个温度监测项目,那么DS18B20这颗数字温度传感器绝对是你的绝佳拍档。它只需要一根数据线就能和MCU通信,抗干扰能力强,还能通…...

5G O-RAN中AI驱动的延迟预测系统设计与优化

1. 项目背景与核心价值在5G O-RAN架构中,延迟控制一直是网络优化的核心痛点。传统电信设备厂商采用的黑盒方案,使得运营商难以针对特定场景进行精细化调优。而O-RAN的开放特性虽然带来了灵活性,但也引入了新的挑战——当CU(集中单…...

做定制开发的定制软件开发公司平台

在数字化转型浪潮下,“定制软件开发”几乎成了每一家力图通过技术构建壁垒的企业的必选项。然而,一个令人尴尬的现实是:很多企业在数字化上砸了重金,不仅没换来效率,反而陷入了“开发超预算、交付总延期、上线全是坑”…...

Docker Compose 镜像检测脚本(支持自动扫描 + 手动输入 YAML)

在日常运维中,经常会遇到这样一个问题: docker-compose 文件里定义了很多镜像,但本地是否已经存在不清楚 如果一个个 docker pull 或 docker images 去对比,会非常低效。 因此我们可以写一个脚本,自动解析 docker-com…...

AI技能统一管理:用Obsidian插件Agentfiles构建你的智能编码中枢

1. 项目概述:一个为AI编码时代打造的技能中枢 如果你和我一样,日常开发工作流里已经塞满了各种AI编码助手——Claude Code、Cursor、Codex、Windsurf……那么你一定也面临过同样的困境:每个工具都有自己的一套“技能”或“记忆”系统&#xf…...

革命性AI图像生成工具Fooocus:让创意触手可及的完整解决方案

革命性AI图像生成工具Fooocus:让创意触手可及的完整解决方案 【免费下载链接】Fooocus Focus on prompting and generating 项目地址: https://gitcode.com/GitHub_Trending/fo/Fooocus 你是否曾经被复杂的AI绘画工具吓退?Fooocus正是为你打造的解…...

Linux fanotify vs inotify:如何为你的监控需求选择正确的工具?

Linux文件监控技术选型:fanotify与inotify深度对比与实践指南 在构建需要实时感知文件系统变化的应用程序时,开发者常面临监控工具的选择困境。无论是开发安全扫描工具、持续备份系统还是智能IDE,文件监控都是核心需求。Linux平台提供了inoti…...