【大数据】Doris 构建实时数仓落地方案详解(三):Doris 实时数仓设计

本系列包含:

  • Doris 构建实时数仓落地方案详解(一):实时数据仓库概述
  • Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读
  • Doris 构建实时数仓落地方案详解(三):Doris 实时数仓设计

Doris 构建实时数仓落地方案详解(三):Doris 实时数仓设计

  • 1.离线数仓分层
  • 2.实时数仓之 Lambda 架构
  • 3.实时数仓之 Kappa 架构
  • 4.基于 Doris 的流批一体方案
    • 4.1 方案一
    • 4.2 方案二
    • 4.3 方案三
    • 4.4 方案四 / 方案五
  • 5.不同场景的方案选择

前面已经解读实时数仓的背景、技术线路和应用场景,这里具体从实现的角度来介绍实时数仓。

1.离线数仓分层

在介绍实时数仓之前,我们先看看离线数仓的标准架构。众所周知,离线数仓一般分为 ODS(Operational Data Store)DW(Data Warehouse)DM(Data Market) 三层架构,这里面的 ODS 就是数据接口层,目前逐步被数据湖的概念取代,但是其基本原理没有变化,主要是 数据同步方法数据存储方式增量数据获取 等方面有所加强。往上 DW 层就是数据仓库层,也是我们离线数据处理和模型设计的核心,现在通用的分层都是分为 DWD(Data Warehouse Detailed)DIM(Dimension)DWS(Data Warehouse Service) 三个模块,DIM 加工一致性维度;DWD 保留业务模型数据并进行数据格式规范化、字段命名标准化;DWS 聚焦指标逻辑加工,并适当进行数据汇总,减少数据量。有时候我们还会在 DWS 层的基础上增加 DWT(Data Warehouse Topic),作为宽表,但是我们也可以将这一层保留在 DWS 中,作为 DWS 层的一部分。DM 层是数据集市层,在 OLAP 查询不理想的情况下,DM 层是需要大力建设的。现在技术发展了,OLAP 查询不再是瓶颈,我们将建设的重心下移到提供一致性对外数据服务的 DWS 层,DM 层的开发工作逐步减少。

在这里插入图片描述
以我目前负责的电商业务为例:

  • 我会在 DWD 层构建一张 订单表,整合所有接口过来的订单相关信息,包括订单的状态、收发货、业务类型、采购信息、支付信息、交易流程信息等,但是不包括商品的层级、店铺等信息。
  • 在 DIM 层构建以商品为核心的 商品信息表,不仅包括商品的属性、业务分类、尺码颜色,还包括商品归属的店铺、价格、采购价等;DIM 层还有用户维度信息,包括用户的注册信息、引流信息、历史成交信息和用户画像标签等。
  • 在 DWS 层,基于 DWD 层的订单信息的基础上计算成交金额、采购成本、订单折扣金额、毛利等指标。这就构成了一个简单的电商数仓最核心的订单业务流程。

2.实时数仓之 Lambda 架构

从离线数仓过渡到实时数仓,我们的基本数仓分层没有变化,只不过为了数据时效性,有时候会省掉其中一些计算步骤。

实时数仓的设计理念主要由两个思路:Lambda 架构和 Kappa 架构。

Lambda 架构是由 Twitter 工程师南森·马茨( N a t h a n M a r z Nathan\ Marz Nathan Marz)提出的。Lambda 架构简单的说就是流式数据作为批处理的补充,流数据之加工当日实时数据,批处理更新当日及之前的数据,在数据应用层将二者加工的结果合并起来。

在这里插入图片描述

3.实时数仓之 Kappa 架构

Kappa 架构可以认为是 Lambda 架构的简化版,即移除 Lambda 架构中的批处理部分。在 Kappa 架构中,需求变更或历史数据变化都通过上游重放完成,即回溯数据进行重算。

在这里插入图片描述
Lambda 架构提倡实时数据流程处理当日数据T+1 数据用离线加工来回补和修正,具有很好的灵活性和可扩展性,也对硬件故障和人为失误有很好的容错性。由于有批处理作为后盾,实时数据加工的压力大大减轻;由于有了离线数据加工,数据的准确性也得到了保障。

Kappa 架构最大的优点是仅需一套代码,可以同时完成流式数据加工和批量数据加工,最大的问题是批量数据加工的能力会低于离线批处理,因此历时数据的回溯时长存在不确定性。

目前大部分都是采用 Lambda 架构,也有不少企业在尝试 Kappa 架构。从设计上说 Kappa 架构肯定是更优的,一套逻辑处理增量和全量,但是实际上比较难实现,或者说实现代价非常高。

要比较两种方案那种更好,我们需要先思考下面四个问题:

  • 我们真的需要一个完全实时的数据仓库吗?很多业务,例如银行的日结、存款利息计算、财务报表统计等都是以日终或者月末作为时点计算的,所以并不需要实时。
  • 在数据准确性和实时性之间,那个更重要?我们都知道不管是 Lambda 架构的实时部分还是 Kappa 架构架构,我们都无法做到 100 % 100\% 100% 准确的实时。
  • 实时计算的中间过程数据保存在 Kafka 中,数据出现了异常,我们要怎么找原因?
  • Kappa 架构虽然给我们规划了一个非常美好的蓝图,但是真的可以实现吗?

4.基于 Doris 的流批一体方案

前面我们介绍了 Doris 具备强大的 多表关联查询能力基于主键的数据增删改能力。所以我们不妨结合流数据和 Doris 强大的查询能力来构建流批一体方案。简单的说就是底层逻辑用流数据写入,上层逻辑通过 SQL 关联来实现。

基于对以上四个问题的思考,我提出了基于 Doris 的全新实时数仓方案,也就是 流 + 批 组合模式。按照流数据加工的层级和批数据加工层级不同,分为了五种具体方案。

方案一方案二方案三方案四方案五
ODS流式写入保留副本保留副本流式写入保留副本
DWD微批加工FlinkSQL 写入保留副本视图 + 隔日刷新FlinkSQL 写入
DWS微批加工微批加工FlinkSQL 写入视图 + 隔日刷新视图 + 隔日刷新
ADS可忽略可忽略可忽略可忽略可忽略

4.1 方案一

方案一是流数据写入 ODS,往上数据加工逐层进行微批处理,在保证数据准确的情况下,提高微批的频率。

在这里插入图片描述
我们可以通过 Flink 清洗 Kafka 日志数据写入 DorisDoris 直接读取 MySQL BinlogDoris 直接读取 Kafka 日志数据 三种方式实现 ODS 层的数据实时接入和实时更新,往上可以通过半小时一次或者更高频率的跑批任务刷新数据到 DWD、DWS、ADS。

4.2 方案二

方案二是用 FlinkSQL 完成 DWD 层数据清洗和表关联,将数据写入 DWD 层,往上逐层进行微批处理。

在这里插入图片描述
我们通过 FinkSQL 读取 Kafka 数据后,利用 FlinkSQL 的 ETL 能力,将数据依次加工成 DWD、DWS,然后写入 Doris,在 Doris 中通过报表直接查询 DWS 的数据,完成数据的实时展现。

4.3 方案三

方案三是 Flink 完成 ODS 到 DWD、DWD 到 DWS 的数据加工,并将数据同步写入 Kafka 和 Doris,Doris 只做数据查询,不进行数据加工。

在这里插入图片描述
需要通过 FinkSQL 完成数据的全流程加工,直接将 ADS 层的数据写入 Doris,由分析平台直接读取结果展示数据。

4.4 方案四 / 方案五

我们还可以针对路径一和路径二进行优化,将 ODS 或者 DWD 层往上的数据加工替换成视图,然后由数据分析平台直接查询顶层的视图,这样就衍生出了方案四和方案五。方案四和方案五的优点是不需要跑批,可以直接查询最实时的数据,缺点是如果代码过于复杂,会影响前端查询性能。

方案四是将方案一中的数据微批处理改成视图,流批用同一个程序,T+1 数据写入实体表,实时数据写入 ODS 后通过视图获取,对外提供实体表 union all 视图的数据给查询使用。

方案五是将方案二的微批处理改成视图,实时数据写入 DWD,往上利用视图查询当日数据,T+1 数据每日刷新写入实体表。

在这里插入图片描述
这五种方案简单实用,虽然无法构建完整的流批一体数仓,但是可以满足大部分实时数仓的需求。之所以提供五个方案,主打一个灵活。

听到这里,可能很多朋友会说,切,你这太简单了吧?这里我会说,简单不好吗?Flink 搞得那么复杂,数据准确性和运维便捷性能超过这五个方案吗?做数仓开发,我从来都崇尚 大道至简,逻辑非常简单都可能会出现 Bug,搞得太过复杂 Bug 不是更多吗?

最后我们再对比一下这五个方案:这五个方案各有优点,也各有缺点,不能简单的说哪个好,哪个不好。各有不同的应用场景:

  • 方案一和方案四的应用场景类似,适合没有大表关联的场景或者三个以上的多表关联场景,在查询性能达不到要求的情况下改用方案一微批加工数据。
  • 方案二和方案五的应用场景类似,适合两个表(例如头行结构的父子表)关联场景,推荐使用 FinkSQL 双流 Join 完成数据的初步关联,降低查询资源消耗。在后续的查询性能达不到要求情况下采用方案二进行微批加工数据。
  • 方案三适合日志数据加工或者对数据准确性要求不高,但是对实时性要求非常高的业务场景。或者每日增量数据特别大,查询太慢、微批处理占用系统资源过多的情况。

以上五个方案都可以实现实时数据和离线数据加工共用一套代码逻辑,降低维度成本,实现了某种程度上的流批一体。

5.不同场景的方案选择

最后,我们再回到前面介绍的八种实时数据的应用场景,根据业务场景的不同,对数据时效性和准确性的要求也不同。

业务场景方案一方案二方案三方案四方案五
监控预警✔️
✔️
实时大屏✔️
✔️
机器人播报✔️
✔️
移动看板✔️
✔️
自助分析✔️
✔️
实时看板✔️
✔️
实时接口✔️
✔️
实时推荐✔️
✔️
  • 监控预警 准确性和时效性要求都很高,但是查询要求不高,所以方案四和方案五均可。
  • 实时大屏 的时效性和查询性能要求高,但是准确性可以低一点,因此优选方案三和方案五。
  • 机器人播报 则是准确性要求最高,查询性能和时效性要求都不高,因此才有方案一和方案二的跑批模式。
  • 移动看板实时看板 的查询性能要求高,数据时效性也要求很高,准确性可以略低一点,因此推荐方案三和方案五。
  • 自助分析 的数据粒度比较细,不需要太过于汇总,查询性能要求高,一般采用方案二和方案五。
  • 实时接口 的数据时效性要求高,查询一般是点查,所以一般采用方案四和方案五。
  • 实时推荐 的数据时效性要求不高,但是查询性能和数据准确性要求高,一般采用方案一和方案二。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库存储引擎和数据类型详细介绍

目录 一、数据库存储引擎(了解)1.了解MySQL体系结构2.存储引擎(了解)2.1.存储引擎的介绍2.2.存储引擎分类2.3.如何选择引擎? 3.事务控制语言(TCL)事务的四个特性(ACID) 二、数据类型(了解)1.整型…

Servlet操作与用法(保姆式教学)

Servlet介绍 什么是servlet Servlet(Servlet Applet的缩写,全称 Java Servlet):适用于Java编写的服务器程序,其主要功能是在于交互式的浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的…

Xmake v2.8.3 发布,改进 Wasm 并支持 Xmake 源码调试

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好&#x…

ARM day1

1.复习今日内容 2.搭建汇编环境 下发资料-》工具软件 -》汇编环境搭建 3.安装Ubuntu下的交叉编译工具链 思维导图:

latexocr安装过程中遇到的问题解决办法

环境要求:需要Python版本3.7,并安装相应依赖文件 具体的详细安装步骤可见我上次写的博文:Mathpix替代者|科研人必备公式识别插件|latexocr安装教程 ‘latexocr‘ 不是内部或外部命令,也不是可运行的程序或批处理文件的相关解决办…

十五、异常(2)

本章概要 自定义异常 异常与记录日志 异常声明 自定义异常 不必拘泥于 Java 已有的异常类型。Java异常体系不可能预见你将报告的所有错误,所以你可以创建自己的异常类,来表示你的程序中可能遇到的问题。 要自己定义异常类,必须从已有的异…

什么是 Redis?

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成的,因此读写速度非常快,常用于缓存,消息队列,分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Has…

C语言环境搭建(Win)

一、C语言简介 1、 C语言简介 C语言是一门通用的、面向过程式的编译型语言,它的运行速度极快,仅次于汇编语言。 C语言是计算机产业的核心程序设计语言,操作系统、硬件驱动、关键组件、数据库等都离不开C语言,广泛应用于底层开发。…

CompletableFuture-链式语法和join方法介绍

2.4 案例精讲-从电商网站的比价需求展开 2.4.1 函数式编程已成为主流 Lambda表达式Stream流式调用Chain链式调用Java8函数式编程 函数式接口: 小结: 函数式接口: Java8新特性_四大内置核心函数式接口_java8 内置核心接口_ZHOU_VIP的博客-…

Nginx之memcached_module模块解读

目录 基本介绍 安装添加模块 模块配置指令 基本介绍 nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcach…

学习路之PHP--lumen安装配置

一、下载lumen源码 composer create-project --prefer-dist laravel/lumen blog 安装lumen-generator composer require flipbox/lumen-generator 二、配置 bootstrap\app.php 97行 $app->register(Flipbox\LumenGenerator\LumenGeneratorServiceProvider::class);三、生成…

【IDEA】IDEA 单行注释开头添加空格

操作 打开 IDEA 的 Settings 对话框(快捷键为CtrlAltS);在左侧面板中选择Editor -> Code Style -> Java;在右侧面板中选择Code Generation选项卡;将Line comment at first column选项设置为false使注释加在行开…

ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...

本文为大家介绍一篇入选ICCV 2023的论文,《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》, 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接:https://arxiv.org/abs/23…

学生宿舍管理系统(前端java+后端Vue)实现-含前端与后端程序

界面介绍 登录 ###宿舍管理 ###菜单管理 ###角色管理 ###班级管理

TensorFlow入门(五、指定GPU运算)

一般情况下,下载的TensorFlow版本如果是GPU版本,在运行过程中TensorFlow能自动检测。如果检测到GPU,TensorFlow会默认利用找到的第一个GPU来执行操作。如果机器上有超过一个可用的GPU,除第一个之外的其他GPU默认是不参与计算的。如果想让TensorFlow使用这些GPU执行操作,需要将运…

源码:TMS FlexCel Studio for .NET 7.19

TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成,适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…

多线程(虚拟地址空间)

代码展示线程 既然我们提到了,线程隶属于进程,是进程的一个执行分支 真的是这样吗? 我们还需要用代码来验证 初步思路是创建三个线程,其中main函数里面的为主线程 不断循环,并且打印相应的pid 假如它们属于不同的进程…

Java 大厂八股文面试专题-JVM相关面试题 类加载器

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式-CSDN博客 JVM相关面试题 1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序…

JDK、JRE 和 JVM 的区别和联系

三者关系 就这三者的关系而言,jvm是jre的子集,jre是jdk的子集,具体关系如下图: Java的执行流程 对于一个Java程序,其执行流程大致如下: 开发人员使用JDK编写和编译Java源代码,生成Java字节码文…

spring源码解析——IOC-开启 bean 的加载

概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中。至此,Spring IOC 的初始化工作完成。接下来我们将对bean的加载进行探索。 BeanFactory 当我…