实时数仓架构选型及建议

随着数据量的不断增大,传统的离线数仓在时效性上已经满足不了我们的需求了,实时数仓架构应运而生。今天我们来总结一下目前市面上常见的一些实时数仓的架构,了解他们的优缺点以及如何在不同的场景中选用正确的架构。

① 数仓分层

在了解实时数仓架构之前,我们先来了解一下数仓中一个重要的概念,叫做数仓分层。我们一般将数仓分为以下几个层次:
  • • ODS层
ODS是数据接入层,也叫贴源层。所有接入的数据首先会进入ODS层。一般来说ODS层的数据的来源比较丰富。从数据粒度上看ODS层是粒度最细的数据层。
  • • DIM层
DIM是维度层。这种数据一般变化不大,数据量也不会太大,可以结合事实表进行关联形成宽表。
  • • DWD层
DWD是明细数据层。是经过ODS层清洗,转后的干净的数据。DWD层数据粒度通常和ODS的粒度相同,不同的是该层的数据质量更高,字段更全面等。
  • • DWS层
DWS是主题数据层。面向主题来组织数据的,通常是星形或雪花结构的数据。从数据粒度来说,这层的数据是轻度汇总级的数据,已经不存在明细数据了。
  • • ADS层
ADS是数据应用层。它是完全为了满足具体的分析需求而构建的数据,也是星形或雪花结构的数据。从数据粒度来说是高度汇总的数据,其汇总的目标主要是按照应用需求进行的。
  • • 数仓分层有时候并不一定按照严格的 ods -> dwd -> dws -> ads 顺序来进行建设。可以根据具体情况随意组合。
  • • 数仓分层的总体思路是用空间换时间,利用大量的预聚合操作来提升用户体验。

② 几种常见的实时数仓方案

数仓分层最早出现在离线数仓中,在实时数仓中,数仓分层仍然适用。下面我们来看下几种常见的实时数仓架构。

方案1. Kappa 架构

  • • Kappa架构将 App 日志、系统日志、binlog日志 等实时地发送到Kafka
  • • 然后通过 Flink,按照不同的业务构建不同的流式计算任务,对数据进行分析和处理
  • • 接着将计算结果输出 MySQL、ES、HBase、KUDU 等数据库中
  • • 最终将计算结果通过 BI 报表进行展现

优点

方案简单,数据实时。

缺点

  • • 每来一个需求或者需求变更时,都需要定制化开发,开发成本和时间成本都比较高
  • • 对于 flink 集群的要求比较高

方案2. 数仓分层 + flink

  • • 首先将数据接入 ODS 贴源数据层
  • • 再使用 Flink 对 ODS 层数据进行 ETL、转换等操作,形成 DWD 数据明细层,并将结果发送到 Kafka
  • • 接着使用 Flink 形成 DWS 轻度汇总层
  • • 最后在 DWS 层上进一步对数据进行汇总形成 ADS 层供业务人员使用

优点

使用了数仓分层,各层的职责清晰,复用性比较高

缺点

和方案1一样,对 flink 集群要求比较高,占用的计算资源比较多

方案3. 数仓分层 + flink + 数据湖

这种方案和方案2很相似,只是在数据存储层将 Kafka 换成了 Iceberg。当然了,你也可以使用其他的数据湖,比如:hudi、Delta Lake。

优点

  • • 实现了流批一体,基于同一个 Flink SQL 既可以进行流计算,也可以进行批计算
  • • 将流计算和批计算的存储进行了统一,这样数据的血缘关系的和数据质量体系的建立也变得简单了
  • • 数据的各层(ODS、DWD、DWS、ADS)数据,都支持OLAP的实时查询
  • • 流式的 Upsert(Delete) 功能。流处理场景下经过窗口时间聚合之后有延迟数据到来的话会有更新的需求。这类需求是需要一个可以支持更新的存储系统的,而离线数仓做更新的话需要全量数据覆盖,而数据湖刚好能解决这个问题

方案4. 基于全场景MPP数据库

除了上述三种常见的方案之外,还有没有其他方案呢?
如果我能提供一个数据库,既可以存储海量数据,又可以实现快速分析,不妨尝试一下,最具有代表性的有:click house、doris等。
我们以最近比较火的 doris 为例来讲解下如何使用 mpp 数据库建设实时数仓。
  • • 实时数据直接写入 kafka
  • • 离线数据可以转为流数据写入 kafka,也可以通过 broker load 等方式导入 doris
  • • 使用 doris 的 stream load 将 kafka 数据实时导入 doris 数据库
  • • 基于 doris 表可以建立物化视图、rollup 等提高查询效率
  • • 基于 doris 表可以直接对外提供统计数据

③ 选型及建议

  1. 1. 对于业务简单,且以流式数据为主的大数据架构可以采用方案1
  2. 2. 如果以流式计算为主,对数据分层要求比较严格,建议使用方案2
  3. 3. 如果想支持更大规模的和复杂的应用场景,人手比较充裕的情况下,建议采用方案3,这也是目前相对比较完善的一个实时数仓架构了
  4. 4. 如果想使用起来简单,业务也比较简单,对于分层的要求也不高,可以无脑使用方案4

④ 写在最后

好了,本次的分享就到这里了。读到这里,相信你对如何选用适合你自己的实时数仓架构有了一个比较清晰的认识了。
如果你还有更好的实时数仓建设经验,不妨拿出来分享一下,互相学习学习。
往期推荐


通俗易懂的 Hbase 原理揭秘

正则表达式其实很简单

如何使用 Kafka Connector 操作 Kafka

本地提交Flink任务到远程 Yarn 集群

数据质量系统设计与实现

Flink CDC零代码实现数据同步实践

kafka 数据快速接入 Apache Doris

Flink CDC数据接入Apache Doris实践

基于Flink和Doris构建的实时数仓方案实践

Flink自定义触发器

Doris数据模型及使用建议

请使用浏览器的分享功能分享到微信等