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

数仓架构演进

数仓 1.0 ,2.0

1.Lambda架构

Lambda将数据处理流分为在线分析和离线分析两条不同的处理路径,两条路径互相独立,互不影响。

离线分析处理T+1数据,使用Hive/Spark处理大数据量,不可变数据,数据一般存储在HDFS等系统上。如果遇到数据更新,需要overwrite整张表或整个分区,成本比较高。

在线分析处理实时数据,使用Flink/Spark Streaming处理流式数据,分析处理秒级或分钟级流式数据,数据保存在Kafka或定期(分钟级)保存到HDFS中。​

该套方案存在以下缺点:

同一套指标可能需要开发两份代码来进行在线分析和离线分析,维护复杂。
数据应用查询指标时可能需要同时查询离线数据和在线数据,开发复杂。
同时部署批处理和流式计算两套引擎,运维复杂。
数据更新需要overwrite整张表或分区,成本高。

2.Kappa架构

随着在线分析业务越来越多,Lambda架构的弊端就越来越明显,增加一个指标需要在线离线分别开发,维护困难,离线指标可能和在线指标对不齐,部署复杂,组件繁多。于是Kappa架构应运而生。

Kappa架构使用一套架构处理在线数据和离线数据,使用同一套引擎同时处理在线和离线数据,数据存储在消息队列上。

Kappa架构也有一定的局限:

流式计算引擎批处理能力较弱,处理大数据量性能较弱。
数据存储使用消息队列,消息队列对数据存储有有效性限制,历史数据无法回溯。
数据时序可能乱序,可能对部分在时序要求方面比较严格的应用造成数据错误。
数据应用需要从消息队列中取数,需要开发适配接口,开发复杂。

在这里插入图片描述

离线处理

典型应用如数据清理,特点是处理数据量大,耗时长。

核心组件选择为:

MapReduce + Hive,或者Spark + Spark SQL。

数据流动为:

流式数据/文件/数据库 -> flume/第三方ETL -> HDFS -> Yarn -> Spark -> Spark SQL -> 数据仓库;

或者

流式数据/文件/数据库 -> flume/第三方ETL -> HDFS-> Yarn -> MapReduce -> Hive -> 数据仓库 (较老)

实时流处理

典型应用如银行实时风控,特点是响应要求实时,数据不落盘(硬盘)。

核心组件选择:

Flink,或者Spark Streaming。 某些情况需要缓存数据时使用Kafka组件,处理完结果可以放在redis(内存数据库)中暂时存储,供上层应用使用。

数据流动为:

实时流/实时文件/数据库 -> flume/第三方ETL -> Kafka -> Flink/Spark Streaming -> redis/Kafka -> 实时应用

注意,这里不会使用HDFS,因为数据不落盘。

实时检索

典型应用如查询一个人的购买记录,特点是响应基本实时(1s),但是不支持负责查询。

核心组件选择:

ES/Hbase/Solr。

数据流动为:

流式数据/文件/数据库 -> flume/第三方ETL -> HDFS -> Yarn -> ES/Hbase/Solr -> 检索。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSZq1yYe-1662111756805)(/images/1/293/2.png)]

数仓3.0

计算引擎做到了批流一体的统一,就可以做到SQL统一

1 基于数据湖的实时数仓

针对Lambda架构和Kappa架构的缺陷,业界基于数据湖开发了Iceberg, Hudi, DeltaLake这些数据湖技术,使得数仓支持ACID, Update/Delete,数据Time Travel, Schema Evolution等特性,使得数仓的时效性从小时级提升到分钟级,数据更新也支持部分更新,大大提高了数据更新的性能。兼具流式计算的实时性和批计算的吞吐量,支持的是近实时的场景。

以上方案中其中基于数据湖的应用最广,但数据湖模式无法支撑更高的秒级实时性,也无法直接对外提供数据服务,需要搭建其他的数据服务组件,系统较为复杂。基于此背景下,部分业务开始使用Doris来承接,业务数据分析师需要对Doris与数据湖中的数据进行联邦分析。

实时流/实时文件/数据库 -> Flink/Spark Streaming -> cdc -> Hudi/Iceberg -> Doris/ClickHouse/StarRocks/Presto/Apache Kylin

在这里插入图片描述

相关文章:

  • 约瑟夫问题对应算法的实现(思路分析) [Java][数据结构]
  • 深圳市第十二届职工技术创新运动会暨2022年深圳技能大赛—集成电路应用开发职业技能竞赛
  • 携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
  • PostgreSQL 创建数据库、创建用户、赋予权限、创建表、主键总结
  • SynchroTrap:基于相似度的异常检测算法
  • 【微信小程序模板直接套用】微信小程序制作模板套用平台
  • 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
  • 适合开发者使用的6款浏览器,开发者工具很实用
  • 中国智能网联汽车信息安全分析2022案例征集
  • UEditorPlus v2.4.0发布 Word图片粘贴重构,功能样式优化
  • 2366. 将数组排序的最少替换次数
  • 牛客 NC26257 小雨坐地铁
  • 基于springboot+vue+elementui的游戏攻略分享平台
  • 【设计模式】Java设计模式 - 模板模式
  • 【C++之数组与指针2】利用指针对数组求和
  • [译]Python中的类属性与实例属性的区别
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 2017前端实习生面试总结
  • Angular 响应式表单 基础例子
  • CEF与代理
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES10 特性的完整指南
  • FastReport在线报表设计器工作原理
  • github从入门到放弃(1)
  • HTML-表单
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java Agent 学习笔记
  • java2019面试题北京
  • JS专题之继承
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • windows-nginx-https-本地配置
  • 工程优化暨babel升级小记
  • 关于Java中分层中遇到的一些问题
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 交换综合实验一
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $(function(){})与(function($){....})(jQuery)的区别
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (八)c52学习之旅-中断实验
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读30/100)Convolutional Pose Machines
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *p++,*(p++),*++p,(*p)++区别?
  • *上位机的定义
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net经典笔试题
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化