实时数仓之实际落地如何选型和构建

2023-11-13

往期类似文章:

实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客

企业级-实时数仓架构图_奔跑者-辉的博客-CSDN博客

第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客

第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客


目录

一、深入实时数仓架构 

二、具体选型建议

三、大厂方案分享

四、结语 & 延申思考

补充几句话:这篇分享,内容分成了一个个小块知识呈现的,大家可结合文章概览看看对哪部分/哪几部分更为感兴趣,或者哪部分知识点掌握程度有待加深。然后直接找到对应的小模块浏览学习。期待你在留言区里讨论交流。 

一、深入实时数仓架构 

实时数仓的查询需求

在正式讨论实时数仓前,我们先看下行业对实时数仓的主要需求,这有助于我们理解实时数仓各种方案设计的初衷,了解它是基于哪些需求应运而生的。

这也将帮助我们从更多维度上思考需求、条件、落地难点等等一些关键要素之间如何评估和权衡,最终实现是基于现有条件下的功能如何将其价值最大化。

传统意义上我们通常将数据处理分为离线的和实时的。对于实时处理场景,我们一般又可以分为两类:

一类诸如监控报警类、大屏展示类场景要求秒级甚至毫秒级;

另一类诸如大部分实时报表的需求通常没有非常高的时效性要求,一般分钟级别,比如10分钟甚至30分钟以内都可接受。

b95f06a5ce47539aed863a12f2841c9f.png

基于以上查询需求,业界常见的实时数仓方案有这几种。

1c14a3d9a8ffce20583783a349656074.png

目前大部分还在使用的标准分层体现+流计算+批量计算的方案。未来大家可能都会迁移到标准分层体系+流计算+数据湖,和基于全场景MPP数据库实现的方案上,我也会重点介绍这两个方案,也希望大家能够多花点时间加以理解。

方案 1:Kappa 架构

首先看下Kappa架构,Kappa架构将多源数据(用户日志,系统日志,BinLog日志)实时地发送到Kafka中。

然后通过Flink集群,按照不同的业务构建不同的流式计算任务,对数据进行数据分析和处理,并将计算结果输出到MySQL/ElasticSearch/HBase/Druid/KUDU等对应的数据源中,最终提供应用进行数据查询或者多维分析。

ac2e6d1e424e2d8933c37dae180437e5.png

这种方案的好处有二,方案简单;数据实时。

不过有两个缺点:

① 用户每产生一个新的报表需求,都需要开发一个Flink流式计算任务,数据开发的人力成本和时间成本都较高。

② 对于每天需要接入近百亿的数据平台,如果要分析近一个月的数据,则需要的Flink集群规模要求很大,且需要将很多计算的中间数据存储在内存中以便多流Join。
56bbe4140375d06815cd0ac6372f4851.png

方案 2:基于标准分层 + 流计算

为了解决方案1中将所有数据放在一个层出现的开发维护成本高等问题,于是出现了基于标准分层+流计算的方案。

接下来咱们看下这种方案,在传统数仓的分层标准上构建实时数仓,将数据分为ODS、DWD、DWS、ADS层。首先将各种来源的数据接入ODS贴源数据层,再对ODS层的数据使用Flink的实时计算进行过滤、清洗、转化、关联等操作,形成针对不同业务主题的DWD数据明细层,并将数据发送到Kafka集群。

之后在DWD基础上,再使用Flink实时计算进行轻度的汇总操作,形成一定程度上方便查询的DWS轻度汇总层。最后再面向业务需求,在DWS层基础上进一步对数据进行组织进入ADS数据应用层,业务在数据应用层的基础上支持用户画像、用户报表等业务场景。

7126b2e15628316aaf106432796a70c4.png

这种方案的优点:各层数据职责清晰。

缺点是多个Flink集群维护起来复杂,并且过多的数据驻留在Flink集群内也会增大集群的负载,不支持upset操作,同时Schema维护麻烦。 

175ee54d21ef7b0000c6b1d9806cd81b.png

方案 3:标准分层体现+流计算+批量计算

     为了解决方案2不支持upset和schema维护复杂等问题。我们在方案2的基础上加入基于HDFS加Spark离线的方案。也就是离线数仓和实时数仓并行流转的方案。

3463a993e7727aa993d018fd6319e249.png

这种方案带来的优点:既支持实时的OLAP查询,也支持离线的大规模数据分析。

缺点:数据质量管理复杂,需要构建一套兼容离线数据和实时数据血缘关系的数据管理体系,本身就是一个复杂的工程问题。离线数据和实时数据Schema统一困难,架构不支持upset。

3d5b32956911d4902ce70ca69f2af39c.png

方案 4:标准分层体系+流计算+数据湖

随着技术的发展,为了解决数据质量管理和upset 问题。出现了流批一体架构,这种架构基于数据湖三剑客 Delta Lake  / Hudi / Iceberg 实现 + Spark 实现。
e21f8d55a01db27ab39590643874a3f2.png

我们以Iceberg为例介绍下这种方案的架构,从下图可以看到这方案和前面的方案2很相似,只是在数据存储层将Kafka换为了Iceberg。

4922d2e0f53291c0eaafb65e4cb5bb74.png它有这样的几个特点,其中第2、3点,尤为重要,需要特别关注下,这也是这个方案和其他方案的重要差别。

① 在编程上将流计算和批计算统一到同一个SQL引擎上,基于同一个Flink SQL既可以进行流计算,也可以进行批计算。

② 将流计算和批计算的存储进行了统一,也就是统一到Iceberg/HDFS上,这样数据的血缘关系的和数据质量体系的建立也变得简单了。

③ 由于存储层统一,数据的Schema也自然统一起来了,这样相对流批单独两条计算逻辑来说,处理逻辑和元数据管理的逻辑都得到了统一。

④ 数据中间的各层(ODS、DWD、DWS、ADS)数据,都支持OLAP的实时查询。

7b00306029e18b182f9b1b414142a8bb.png

那么为什么 Iceberg 能承担起实时数仓的方案呢,主要原因是它解决了长久以来流批统一时的这些难题:

① 同时支持流式写入和增量拉取。

② 解决小文件多的问题。数据湖实现了相关合并小文件的接口,Spark / Flink上层引擎可以周期性地调用接口进行小文件合并。

③ 支持批量以及流式的 Upsert(Delete) 功能。批量Upsert / Delete功能主要用于离线数据修正。流式upsert场景前面介绍了,主要是流处理场景下经过窗口时间聚合之后有延迟数据到来的话会有更新的需求。这类需求是需要一个可以支持更新的存储系统的,而离线数仓做更新的话需要全量数据覆盖,这也是离线数仓做不到实时的关键原因之一,数据湖是需要解决掉这个问题的。 

④ 同时 Iceberg 还支持比较完整的OLAP生态。比如支持Hive / Spark / Presto / Impala 等 OLAP 查询引擎,提供高效的多维聚合查询性能。
2c3f695c513aa68c867bb95c4fb92826.png

Iceberg 实战

上面介绍了基于Iceberg的标准分层体系+流计算+数据湖的架构,下面从实战角度看下Iceberg如何使用。

lceberg写入流式数据代码实现如下:

data.writeStream.format("iceberg") 
.outputMode("append") 
.trigger(Trigger.ProcessingTime(1, TimeUnit.MINUTES)).option("data_path", tableIdentifier) 
.option("checkpointLocation", checkpointPath) 
.start()

上述代码会将data_path下的数据以流的形式,实时加入到系统中进行计算。

lceberg数据过滤代码实现如下:

Table table = ... Actions.forTable(table).rewriteDataFiles() .filter(Expressions.equal("date", "2022-03-18")) 
.targetSizeInBytes(500 * 1024 * 1024) // 500 MB 
.execute();

上述代码过滤出date为2022-03-18的数据。

案 5:基于全场景MPP数据库

前面的四种方案,是基于数仓方案的优化。方案仍然属于比较复杂的,如果我能提供一个数据库既能满足海量数据的存储,也能实现快速分析,那岂不是很方便。这时候便出现了以StartRocks和ClickHouse为代表的全场景MPP数据库。

① 基于Darios或者ClickHouse构建实时数仓。来看下具体的实现方式:将数据源上的实时数据直接写入消费服务。

② 对于数据源为离线文件的情况有两种处理方式,一种是将文件转为流式数据写入Kafka,另外一种情况是直接将文件通过Sql导入ClickHouse集群。

③ ClickHouse接入Kafka消息并将数据写入对应的原始表,基于原始表可以构建物化视图、Project等实现数据聚合和统计分析。

④ 应用服务基于ClickHouse数据对外提供BI、统计报表、告警规则等服务。 

77d9d612cfa075a00a7497fd7533a895.png

二、具体选型建议

对于这5种方案,在具体选型中,我们要根据具体业务需求、团队规模等进行技术方案选型。

说到这儿,我有这样的几点具体建议,希望或多或少可以给你提供一些可供参考、借鉴的新视角或者新思路:

① 对于业务简单,且以流式数据为主数据流的大数据架构可以采用方案1的Kappa架构。

② 如果业务以流计算为主,对数据分层,数据权限,多主题数据要求比较高,建议使用方案2的基于标准分层+流计算。

③ 如果业务的流数据是批数据都比较多,且流数据和批数据直接的关联性不大,建议使用方案3的标准分层体现+流计算+批量计算。这种情况下分别能发挥流式计算和批量计算各自的优势。

621cae1b609f1250359913d1f03f6873.png

④ 方案4是一个比较完善的数仓方案,要支持更大规模的和复杂的应用场景,建议大数据研发人员在20以上的团队,可以重点考虑。

⑤ 对于大数据研发组团队为10人左右,要维护像方案2、3、4那样以ODS、DWD、DWS、ADS数据分层的方式进行实时数仓建设的话,就需要投入更多的资源。建议使用方案5一站式实现简单的实时数仓。

三、大厂方案分享

介绍了这么多实时数仓方案,那么很多小伙伴会问了,大厂到底用的那种方案呢?其实每个大厂根据自己业务特点的不同,也会选择不同的解决方案。下面为大家简要分享下OPPO、滴滴和比特大陆、美团实例方案,以便大家能够更好地理解这篇分享中五种架构的具体落地。

不过具体架构细节我不会进行过多的介绍,有了前面的内容基础,相信大家再通过架构图就能很快了解每个架构的特点。这里只是希望大家能够通过大厂的经验,明白他们架构设计的初衷和要解决的具体问题,同时也给我们的架构设计提供一些思路。

举例来说,OPPO实时计算平台架构,其方案其实类似于方案2的基于标准分层+流计算。

滴滴的大数据平台架构是这样的,它的方案其实类似于方案2的基于标准分层+流计算。

fced5c0ea1ab1ab65058e9846d634f80.png

滴滴顺风车实时数仓案例

再结合比特大陆的方案看下,其方案类型方案3的标准分层体现+流计算+批量计算,同时也引入了ClickHouse,可以看到比特大陆的数据方案是很复杂的。

1b4969459f7700db62b14285c4826825.png

美团点评基于Flink的实时数仓平台实践

四、结语 & 延申思考

本文介绍了市面上常见实时数仓方案,并对不同方案的优缺点进行了介绍。在使用过程中我们需要根据自己的业务场景选择合适的架构。

另外想说明的是实时数仓方案并不是“搬过来”,而是根据业务“演化来”的,具体设计的时候需要根据自身业务情况,找到最适合自己当下的实时数仓架构。

延申思考

我们在实时数仓的构建过程中比较大的争议是采用标准分层体系+流计算+数据湖的方案,还是试用基于全场景MPP数据库实现 ?

在讨论过程中大家比较大的分歧是基于全场景MPP数据库实现到底算是一个数仓方案不,毕竟该方案没有标准的数仓分层的思想,而是围绕大规模数据统计的需求来实现的。

但是我的观点是:一切方案都需要以实际需求为出发点,我们的80%的需求就是在一个180多个字段的大宽表(每天80亿条,3TB数据量)上可以灵活的统计分析,快速为业务决策提供依据。因此我们选择了基于全场景MPP数据库方案。

新的技术层出不穷,对我们技术人来说尝鲜是很爽的一件事情,但是实际落地还是建议大家把需求收敛好后再做决策,保持冷静的思维,有时候适当地“让子弹飞一会”也是有好处的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时数仓之实际落地如何选型和构建 的相关文章

  • JS逆向steam登录

    JS逆向steam登录 前言 我们爬虫有时候 会遇到登录才能获取到数据的情况 最开始的时候我们只需要加入请求的data参数就可以 可是现在网站为了反爬 对登录的密码或者账号都做了加密处理 如果我们不破解出这些加密的密码或者账号 就没办法实现
  • 数据库报Connection is read-only. Queries leading to data modification are not allowed

    数据库报Connection is read only Queries leading to data modification are not allowed 具体是某张表的插入操作时报的错误 问题排查过程 这个超过是批量操作发生的 第一

随机推荐

  • Linux-du命令

    du命令 说明 du命令也是查看使用空间的 但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看 还是和df命令有一些区别的 参数 a或 all 显示目录中个别文件的大小 b或 bytes 显示目录或文件大小时 以b
  • EL表达式语言

    引用 http blog 163 com s zhchluo blog static 1501470820075205739439 基本语法 一 EL简介 1 语法结构 expression 2 与 运算符 EL 提供 和 两种运算符来存取
  • 【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

    博主 初映CY的前说 前端领域 本文核心 uniapp中this指向问题 前言 this大家知道是我们当前项目的实例 我们可以在这个this上面拿到我们原型上的全部数据 这个常用在我们在方法中调用其他方法使用 一 uniapp中this指向
  • Cplex—java集成,idea配置 步骤大全 windows版本

    首先搜索官网cplex下载安装包 本次示例以windows版本 1 双击打开安装包 2 选择简体中文 3 都是默认 修改路径的同学请记得自己的安装路径后面配置环境变量要用 4 这里我已经安装过了中间步骤直接跳过 5 接下来我们需要在java
  • 郑州大学校园网故障问题解决方法

    1 郑州大学校园网学生用户使用指南 可进入郑州大学网络管理中心网站 校园网交流QQ群 群一475137403 群二685466506 微信公众号 郑州大学网络管理中心 一 校园网注册 1 微信扫码并关注 郑州大学网络管理中心 点击进入微信公
  • FFMPEG对于rtp的推流以及VLC验证

    前言 参考资料 https blog csdn net zhoubotong2012 article details 86711097 https blog csdn net zhoubotong2012 article details 8
  • 2021-10-23

    对于算法题 还是要及时地进行总结和收获 不然 对于核心的知识掌握过几天就忘记了 相当于之前付出的努力都打了水漂 多浪费啊 LRU缓存机制 LRU 缓存机制 运用你所掌握的数据结构 设计和实现一个 LRU 最近最少使用 缓存机制 实现 LRU
  • 【转】在java中,OOA是什么?OOD是什么?OOP是什么?

    Object Oriented Analysis 面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后 按照面向对象的思想来分析问题 OOA与结构化分析有较大的区别 OOA所强调的是在系统调查资料的基础上 针对OO方法所需要的素
  • C++ vector容器-44-vector插入和删除以及存取

    本篇继续学习vector容器 前面学习了vector是一个单端数组 也就是说vector的插入和删除 基本上都是在数组的末端进行 本篇要学习的vector插入和删除的方法就能体现这个特点 最后学习vector的存取操作 1 vector的插
  • 论文笔记 2023.5.22

    图像分类的深度卷积神经网络模型综述 图像分类的过程 图像预处理 图像特征提取 人工提取 传统图像分类算法 卷积操作提取 卷积神经网络 使用分类器对图像进行分类 以图像分类为载体 深度卷积神经网络模型主要包括以下四个类别 1 经典深度卷积神经
  • KVM处理器管理和硬件辅助虚拟化技术

    KVM处理器管理和硬件辅助虚拟化技术 Intel 在2006年发布了硬件虚拟化技术 其中支持X86体系结构的称为Intel VT x技术 AMD称为SVM技术 VT x引入了一种新的处理器操作 叫做VMX Virtual MachineEx
  • 基于多项贝叶斯的三分类的情感分析实现

    写在前面 本实验报告是一篇很水的水课的期末大作业 代码 数据集均为原创 意在用最少的代码和最简单的数据集完成老师留下的题目 仅供交流学习使用 禁止直接洗稿嗷 目录 写在前面 一 实验目的 二 实验手段和方法 三 实验内容 四 实验总结 一
  • 量子计算(13)基础知识4:量子测量

    量子测量是量子电路中最后一个元素 在电路中我们经常用到 下面 我将描述量子测量的数学依据以及与量子测量相关的科学定理 目录 一 量子测量 1 理论知识 2 计算基下测量单量子比特 二 两个原理 1 延迟测量原理 2 隐含测量原理 一 量子测
  • Linux下查找文件(日志)中的关键字

    进入到需要查看日志文件的目录 执行以下命令 即可快速定位到想要查看日志内容所在行 1 查看日志 前 n行 cat 或者 tail 日志文件名 head n 数量 示例1 cat api log head n 200 查看log前200行 示
  • three.js加载纹理总是黑色的问题

    什么是纹理 简单理解就是贴在几何体或平面的纹路 就比如一个杯子上的图案 菜鸟 包括我 根据three js教程上代码敲上去之后 纹理没有效果 查阅了半天 总结有以下几个原因 1 图片路径 谷歌浏览器需要在属性中按照如图配置 allow fi
  • SYS_PTRACE容器

    docker run cap add SYS PTRACE security opt seccomp unconfined security opt apparmor unconfined
  • 基于springboot+vue的电影视频订票咨询网站系统-Java项目毕业设计

    项目介绍 随着网络不断的普及发展 影城管理系统依靠网络技术的支持得到了快速的发展 首先要从用户的实际需求出发 通过了解用户的需求开发出具有针对性的首页 电影信息 电影资讯 个人中心 后台管理 在线客服功能 影城管理系统的主要使用者分为管理员
  • 全数字锁相环的研究与设计

    参考文档 http www doc88 com p 4364928925689 html 一篇硕士学位论文 全数字锁相环的研究与设计 https www docin com p 1390623327 html 基于延迟锁定环的TDC的设计
  • mysql 连接池断开后自动连接

    MySQL对所有连接的有效时间默认为28800秒 正好8小时 也就是说 如果一个连接8小时没有请求和操作 就会自动断开 但是对于 Hibernate来说 它的连接池并不知道它所管理的连接中是否有被MySQL断开的 如果一个程序要使用数据库连
  • 实时数仓之实际落地如何选型和构建

    往期类似文章 实时数仓之 Kappa 架构与 Lambda 架构 奔跑者 辉的博客 CSDN博客 企业级 实时数仓架构图 奔跑者 辉的博客 CSDN博客 第一部分 Spark基础篇 奔跑者 辉的博客 CSDN博客 第一部分 Flink基础篇