Doris——纵腾集团流批一体数仓架构

目录

前言

一、早期架构

二、架构选型

三、新数据架构  

3.1 数据中台

3.2 数仓建模

3.3 数据导入

四、实践经验

4.1 准备阶段

4.2 验证阶段

4.3 压测阶段

4.4 上线阶段

4.5 宣导阶段

4.6 运行阶段

4.6.1 Tablet规范问题

4.6.2 集群读写优化

五、总结收益

六、未来规划


  原文大佬的这篇Doris数仓建设案例有借鉴意义,这里摘抄下来用作学习和知识沉淀。

前言

  纵腾集团以“全球跨境电商基础设施服务商”为企业定位,聚焦跨境仓储与物流。随着纵腾集团业务的快速发展,早期基于多套 CDH 大数据架构的技术栈和组件繁杂,开发和运维难度高、效率低,数据质量和时效难以保障,已无法满足当下数据分析需求,严重影响相关工作的开展。因此,纵腾集团在 2022年正式引入 Apache Doris,基于Doris 构建了新的流批一体数据架构,同时建立了以 Doris 为核心的数据中台。构建过程中对读写时效性、服务的稳定性及高并发读写等多方面进行了优化。

一、早期架构

    早期数仓架构主要分为两套基于 CDH 的大数据集群,这两套架构用于不同产品线的数仓需求、数据大屏和 BI 报表等应用

      这两套架构为独立的数据管道,具有耦合度低,集群间相互独立等特点,便于精细化管理。但随着业务需求的不断变化,这样的特点也引发出许多新的问题:

  • 元数据和数据质量缺乏管控,数据质量无法得到保障
  • 不同业务数据独立存储维护导致数据孤岛,不利于数据整合
  • 每个集群的机房分布不一,维护成本非常高
  • 集群间的技术栈和组件较多且存在差异性,对统一开发运维和数据整合都极具挑战性

二、架构选型

    为了解决早期架构的痛点、更好满足日益严苛的数据需求,我们希望能有一款产品帮助我们快速构建流批一体的数仓架构,构建数据中台服务。

   我们对传统数仓、 实时数仓和数据湖进行了对比。从上图可知,传统数仓可以支撑超PB级的海量数据,但是交互查询性能相对差一些,偏离线场景,不满足我们对数据实时性的要求;

   数据湖可以支撑超海量的数据,支持数据更新,查询性能适中,但是数据湖近两年才开始应用,成熟度较低,使用风险较大;

   实时数仓适用PB 级数据存储,支持数据更新且查询性能非常好,结合我们的要求,实时数仓与我们的使用和需求场景都比较贴合,因此我们最终决定选择实时数仓作为数据底座。

    接着我们对市面上较为流行的三款实时数仓:ClickHouse、Druid、Doris 进行了选型对比,对比图如下:

   对比可知,Doris 优势明显、性价比更高,具有独立主从架构简单,运维更灵活便捷、丰富的数据模型、优秀的查询性能和周全的生态规划等诸多优势,对比这三个产品,Doris 最符合我们的选型要求。

三、新数据架构  

  

   新数据架构加基于Doris简化了数据采集、存储和计算的流程:

  • 结合 DataHub实现自研元数据采集和周期管理
  • 通过Seatunnel集成 Flink Doris Connector 稍加改造实现全量加增量数据的一体化采集

  • 简化存储媒介,对 ClickHouse、Kudu、HBase等技术栈进行收敛,由Doris 进行流批数据的统一存储

  • 以 Doris为核心数据底座,结合Kyuubi 的 JDBC引擎直连查询(自研)和 Spark 引擎中的 Spark Doris Connector 进行 ETL 开发(原生),统一计算引擎管理、权限管控和对外服务。

  基于上述几点进行了数据应用开发及对外提供服务,构建了数据中台。

3.1 数据中台

    我们以Doris 为核心底座创建了数据平台,核心功能包括:指标中心、元数据中心、基础配置中心、即席分析和数据接口服务中心,其中指标中心和即席分析的数据主要来源于Doris ,当前已上线几百个指标。

3.2 数仓建模

    结合Doris 的特性重新对数仓进行了建模,数仓分层与传统数仓类似,其中ODS数据为存量和增量一体的导入模式,同时为防止出现[随机查询结果问题],ODS层最终选用Unique 数据模型,相比于Aggregate模型可以实现写时合并(Merge-on-Write),有效提高数据实时性,且Aggregate 模型查询性能更接近于Duplicate模型,对于ODS层是非常好的的选择。

  DIM/DED/DWS/ADS 层主要选用 Aggregate 数据模型; Aggregate 数据模型提供的四种聚合方式可以在大部分场景下达到事半功倍的效果,帮助我们快速应对不同的需求场景。

  • SUM:能够高效实现 PV 类指标计算,但对于 UV 类的指标需要考虑预去重。

  • MAX/MIN:常用于最大最小运单时间节点类指标或包裹体积/重量最大最小值的指标计算。

  • REPLACE_IF_NOT_NULL:可以自动地过滤空值,非常便捷地实现仅记录最后一条数据,适用于大部分 DW 场景。

3.3 数据导入

   ods层的数据导入主要以Stream Load为主,在 HDFS上的历史存量数据也会通过 Broker Load或Spark Load导入。DW 层数据主要以insert into方式导入,同时为减轻Doris内存压力,我们将部分ETL任务放到Kyuubi On Spark 引擎上去计算,目前在DolphinScheduler每天平稳调度 Doris DW 任务有上万个,其中大部分为T+1 任务,小部分为小时级任务。

四、实践经验

     对于以Doris 为核心的新数据架构,我们规划了6个阶段进行运行测试,直至可以上线运行。(重点关注压测阶段和运行阶段,有一些调试优化经验分享给大家)

4.1 准备阶段

   引入 Doris 时是 2022 年 2月,因此选择当时最新版本Doris 0.15 Release 版本进行应用,主要考虑维度如下:

  • 支持事务性插入语句功能

  • 支持 Unique Key 模型下的Upsert

  • 支持SQL 阻塞List 功能,可以通过正则、哈希值匹配等方式防止某些SQL 的执行

  • 可通过资源标签方式将一个Doris 集群中的BE节点划分为多个资源组,实现多租户和资源隔离

  • 该版本提供了官方认可的 Flink-Doris-Connector/Spark-Doris-Connector/DataX Doriswriter 等插件,利于ETL流程建设

4.2 验证阶段

  该阶段主要是为了二次验证官方文档中介绍的功能是否满足我们的实际运用场景,比如生态扩展中的Connector、外表联邦查询、各种Load方式、多租户隔离及物化视图等。

4.3 压测阶段

    压测阶段首先进行数据生成,数据集选用的是 TPC-DS 数据,接着根据 Doris 的特性对 DDL 和 SQL 等规则进行对应调整,最后通过脚本将数据导入到 Doris 存储中,再通过自动化脚本进行查询及导入压测,最终将压测结果输出到 MySQL 表中,量化为图表进行展示。下方为本阶段的基本配置及压测过程介绍:

- 硬件环境

  • 内存:256G

  • CPU:96C

  • 硬盘:SSD 1.92T * 8

- 软件环境

  • Apache Doris 版本:0.15-release/1.0-release(该阶段进行时,1.0-release 版本刚好发布)

  • Apache Doris 集群:3 FE + 9 BE

  • 系统:CentOS Linux release 7.9.2009

- 数据集信息

  我们生成了 1T、5T、10T 的 TPC-DS 数据集,1T 的数据集约有30亿数据量。

查询压测

    压测过程中,最初使用 0.15-release 版本进行测试,正巧 1.0-release 版本发布,后决定更换为 1.0-release 版本进行后续的压测。下图是基于 1T 的 TPC-DS 数据在同等硬件配置环境下和某商业 MPP 数据库的对比结果: 

    如图所示,Doris的查询压测性能优异,有着明显的性能优势。

导入压测

  • 导入方式:通过 DataX Doriswriter 以 StreamLoad 方式进行写入压测

  • 数据来源:为避免因Source端原因影响写入时效,选择 100 张相同大表,即 100 个并发从内网 Hive 中导入(例如 tpcds-ds 的 store_sales_1t 表)

  • 数据模型:选用 Unique 模型(模拟ODS层),同时为充分考虑 Compaction合并性能及小文件场景,每张表设置 70 个Tablet(数据分片)

    经调整优化后,最大写入时效为 269 MB/S &  680K ops/s,平均写入时效 70 MB/S & 180K ops/s,写入时效大幅提升。

4.4 上线阶段

  该阶段主要是确认Doris 上线需要的检查清单、预调参数、BE 资源组规划及用户权限的划分。

  • 检查清单:包括但不限于 FE & BE 端口、网络检查及Doris 的一些功能性验证,例如读写是否正常等。

  • 预调参数:确认优化后的 FE&BE 参数是否配置,是否开启global enable_profile、动态分区以及数据盘保存位置是否有误等。

  • BE 资源组:由于我们需要通过Doris 的多租户特性对不同的用户进行资源隔离,所以需要提前规划好每个 BE 节点对应的资源组。

  • 用户权限:对于不同的用户群体提前规划好权限范围,比如分析师开发只需要SELECT_PRIV权限,而 ETL 工程师需要SELECT_PRIV、LOAD_PRIV和CREATE_PRIV权限。

4.5 宣导阶段

     该阶段主要是输出前面各阶段的 TimeLine、总结以及上线后使用 Apache Doris 的注意事项说明,比如我们用到多租户隔离,那么 DDL 建表时则需要在 Properties 中显示指定各副本对应的资源组:

create table zt_table
......
properties("replication_allocation"="tag.location.group_a:1, tag.location.group_b:1, tag.location.group_c:1"
)

4.6 运行阶段

4.6.1 Tablet规范问题

问题描述:上线运行一段时间后,随着越来越多的数据增长,集群每次重启后一周左右,读写就会开始变得越来越慢,直到无法正常进行读写。

问题处理:

  • 经过对生产和 UAT 环境的对比测试以及对数仓表的Schema的分析,我们发现有些表数据并不大,但是 Bucket 却设置的非常大

  • 结合show data from database命令,将整个集群所有表的Bucket 信息罗列出来,明确了大部分表的Bucket 设置的不合理;而当前集群共 20T 左右数据,平均 1T 数据近 10W 个 Tablet,这就会导致小文件过多,造成 FE 元数据负载过高,从而影响导入和查询性能。

  • 定位原因后,根据官方建议将 Bucket设置不合理的表全部调整,调整后集群逐步恢复读写正常。(即将发布的 Apache Doris 1.2.2 版本将推出 Auto Bucket 动态分桶推算功能,可以根据历史数据和机器数目自动推算新建 Partition 的分桶个数,保证分桶数始终保持在合理范围内,可有效解决上述问题)

问题小结:

  • Tablet数 = 分区数 * 桶数 * 副本数

  • 1TB 数据的Tablet数量控制在8000 左右(三副本控制到 2.4W 左右)

  • 建议大表的单个 Tablet存储数据大小在 1G-10G 区间,可防止过多的小文件产生

  • 建议百兆左右的维表 Tablet 数量控制在 3-5 个,保证一定的并发数也不会产生过多的小文件

4.6.2 集群读写优化

问题描述:1.1.3 release 版本中,高并发的同时进行 Stream Load、Broker Load、insert into 和查询时,读写会变得非常慢,如下图 11/01 19:00 并发上来后的 Txn Load 所示

问题处理:

(1) 我们进行了十几轮对比测验,结论如下:

  • 写入速度与并发的增长成反比(但不会骤变,而是缓慢变化)
  • 单表 Bucket(Tablet)设置过大会导致集群写入速度骤减;例如 A 库的 TA 表,设置 80 个 Bucket 时,启动相关 Flink Sink Job 就会导致集群整体写入速度迅速变慢,降低 Bucket(9~10个)时写入恢复正常。
  • insert into select 的 ETL 任务与 Stream Load 写入任务会进行资源抢占,同时并发运行会使整个集群读写变慢。

(2)通过be.info发现,80 个 Bucket表写入某个Tablet 的 memsize/rows/flushsize/duration数值比 10 个 Bucket 写入时的数值呈数倍之差,即 80 个 Bucket 表的数据写入时效无论 Memsize 还是 Flushsize 都非常小、但花费时间却很长。

(3)同时收集 Pstack 日志,经过分析可以确定,Tcmalloc 在频繁地寻找pageheap_lock,导致高频竞争锁从而降低了读写性能。

(4)于是,进行如下参数调整:

减少doris_be进程内存返回给linux系统的频率,从而减少tcmalloc频繁竞争锁的情况
tc_use_memory_min = 207374182400
tc_enable_aggressive_memory_decommit = false
tc_max_total_thread_cache_bytes=20737418240

(5)调参并滚动重启BE后,集群状况如下图所示:

     18:50 前将 Broker Load、insert into 和查询任务同时开启,18:50 后将 Stream Load 任务也开启(包括 80 bucket的表),集群整体的读写性能不仅没有下降,反而 Stream Load 时效突破了压测阶段的最大值 269 MB/S&680K /ops/s,并且持续稳定。

问题小结:

    使用 Doris 1.1.3 及以上版本,非常推荐调整 Tcmalloc 相关参数,减少doris_be进程与系统之间的内存申请回收过程,可明显减少锁竞争的现象,大大提升读写性能和集群稳定性。(从 Doris 1.1.5 版本开始,增加了Tcmalloc 简化配置,可将众多 Tcmalloc 参数归约到参数memory_mode中,compact 为节约内存模式,performance 为性能模式,用户可根据实际需求进行调整)

五、总结收益

   当前 Doris 的生产集群为 3 FE + 9 BE 组合, 已导入集团存量和增量数据的 60%以及部分DW 数据生成,3 副本共占 44.4TB 的存储。

    依赖Doris 自身优异特性及其生态圈帮助我们快速构建了一套新的流批一体数据架构,平均每天实时入库的数据量达到上亿规模,同时支持上万个调度任务平稳运行,相比早期架构单表查询效率提升近 5 倍,数据导入效率提升近 2 倍,内存资源使用率显著减少。除此之外,Doris 以下优势也是我们快速构建数据架构的重要推动力:

  • 扩展表:联邦查询的设计,便于集成其它存储

  • 数据表设计:丰富的数据模型,可快速应对不同的数据需求。

  • 数据查询:不同的Join 算子结合自身完善的优化器,让查询快而稳。

  • 架构设计:架构清晰明了且运维简单,大大地降低了我们的运维成本。

  • 数据导入:各种 Load方式及 Connector的扩展,基本涵盖大部分的数据同步场景应用。

六、未来规划

     结合当下业务场景的考虑,未来将引入数据湖进行非结构化和结构化数据一体存储,进一步完善流批一体架构。

 参考文章:

打破数据孤岛,Apache Doris 助力纵腾集团快速构建流批一体数仓架构|最佳实践

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

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

相关文章

【Vue】VueX仓库

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳中求进,晒太阳 目录 Vue概述 是什么 场景: 优势 构建多组件共享环境 创建一个空仓库 核心概念 - state 状态 1. 提供数据 2.使用数据 ​编辑 …

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(上)

项目简介 本项目致力于探索和实现一种高度集成的机器人系统,旨在通过结合现代机器人操作系统(ROS)和先进的硬件组件,解决特定的自动化任务和挑战。一部分是基于Jetson Orin主板的LIMO PPRO SLAM雷达小车,它具备自主导航…

ELF 1技术贴|在NXP源码基础上适配开发板的按键功能

本次源代码适配是在NXP i.MX6ULL EVK评估板的Linux内核源代码(特定版本号为Linux-imx_4.1.15)的基础中展开的。 首要任务集中在对功能接口引脚配置的精细调整,确保其能无缝匹配至ELF 1开发板。接下来,我们将详细阐述适配过程中关…

MapReduce内存参数自动推断

MapReduce内存参数自动推断。在Hadoop 2.0中,为MapReduce作业设置内存参数非常繁琐,涉及到两个参数:mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts,一旦设置不合理,则会使得内存资源浪费严重&a…

KingbaseES-V8R3下载安装及基础配置以及创建用户数据库

KingbaseES-V8-R3安装 1 下载准备安装包 下载地址:https://gitlab.cn/renfei/KingbaseES-V8-R3 准备好安装包及license.dat文件上传至服务器 2 挂载安装包 安装包为iso文件,需要挂载到目录 mount KingbaseES_V008R003C002B0340_Lin64_install.iso /…

Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量 1.创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对像的名字 nsems:信号量的数量 semflg:IPC_CREAT 返回值:成功返回信号量ID…

5G智能制造热力工厂数字孪生可视化平台,推进热力行业数字化转型

5G智能制造热力工厂数字孪生可视化平台,推进热力行业数字化转型。在当今这个信息化、数字化的时代,热力生产行业也迎来了转型的关键时刻。为了提升生产效率、降低成本、提高产品质量,越来越多的热力生产企业开始探索数字化转型之路。而5G智能…

SAP 工单CO02删除标记设置增强

需求:工单打上删除标记时检查,满足才能打上删除标记 位置:PPCO0002 -> EXIT_SAPLCORO_001 -》INCLUDE ZXCO1U02.中 如果没有,就新建 然后写下代码测试: MESSAGE test TYPE I. 然后就可以写下自己要的检查了&…

three.js如何实现简易3D机房?(一)基础准备-下

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;&#xff08;一&#xff09;基础准备-上&#xff1a;http://t.csdnimg.cn/MCrFZ 目录 四、按需引入 五、导入模型 四、按需引入 index.vue文件中 <template><div class"three-area">&l…

基于springboot+vue实现会议室预约系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现会议室预约系统演示 摘要 一个企业的发展离不开相关的规定流程。信息化到来的今天在我们的生活当中。离不开各种信息化的支持。比如钉钉会议预约、美团买菜、扫码签到等各种信息化软件。他们涉及我们生活中的方方面面给我们的生活提供了更大的便利性。大到政…

css网格布局简单介绍

前端网格布局是一种用于在网页上创建复杂网格系统的布局技术。它允许开发者通过简单的语法来定义和控制元素的排列方式&#xff0c;使得页面布局更加灵活和可预测。在CSS中&#xff0c;网格布局可以通过display: grid属性来实现。 特点 1. **灵活性**&#xff1a;网格布…

微信小程序开发系列(十一)·小程序页面的跳转设置以及参数传递

目录 1. 跳转到商品列表 1.1 url: 当前小程序内的跳转链接 1.2 navigate&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面 1.3 redirect&#xff1a; 关闭当前页面&#xff0c;跳转到应用内的某个页面。但不能跳转到 tabbar 页面…

在 Flutter 中使用 flutter_gen 简化图像资产管理

你是否厌倦了在 Flutter 项目中手动管理图像资产的繁琐任务&#xff1f; 告别手工输入资源路径的痛苦&#xff0c;欢迎使用“Flutter Gen”高效资源管理的时代。在本文中&#xff0c;我将带您从手动处理图像资源的挫折到动态生成它们的便利。 选择1&#xff1a;痛苦手动添加–…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中&#xff0c;参数化构建是一种非常有用的功能&#xff0c;它可以让用户在构建过程中输入参数&#xff0c;从而实现更灵活的构建流程。有时候&#xff0c;我们希望两个参数之间能够实现联动&#xff0c;即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…

ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件

ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件 今天登录一个网站发现一个pdf文件很漂亮&#xff0c;于是想下载下来转成png图片。 于是用wps软件打开&#xff0c;然后进行转换。。。。。。 果然天下没有免费的午餐。既然AI时代已经到来&#xff0c;那就交给无所不能的AI…

DataGrip 连接 Centos MySql失败

首先检查Mysql是否运行&#xff1a; systemctl status mysqld &#xff0c; 如果显示没有启动则需要启动mysql 检查防火墙是否打开&#xff0c;是否打开3306的端口 sudo firewall-cmd --list-all 如果下面3306没有打开则打开3306端口 publictarget: defaulticmp-block-inver…

2195. 深海机器人问题(网络流,费用流,上下界可行流,网格图模型)

活动 - AcWing 深海资源考察探险队的潜艇将到达深海的海底进行科学考察。 潜艇内有多个深海机器人。 潜艇到达深海海底后&#xff0c;深海机器人将离开潜艇向预定目标移动。 深海机器人在移动中还必须沿途采集海底生物标本。 沿途生物标本由最先遇到它的深海机器人完成采…

【自动驾驶技术系列丛书学习】1.《自动驾驶技术概论》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;王建、徐国艳、陈竞凯、冯宗宝 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.汽车发展史 2.国…

Docker常用基础指令

目录 1 前言 2 常用指令 2.1 获取帮助 2.2 拉取镜像到本地 2.3 对本地镜像进行打包 2.4 对本地镜像的删除 2.5 通过tar包加载本地镜像 2.6 查看所有镜像 2.7 创建新的容器 2.8 查看容器 2.9 停止容器运行 2.10 运行容器 2.11 删除容器 2.12 查看容器日志 2.13 进…

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候&#xff0c;我们需要进行分区统计&#xff0c;如果挨个裁剪数据再统计&#xff0c;不仅步骤繁琐、耗时&#xff0c;还会产生一些多余的数据&#xff0c;这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度&#xff0c;希望能对你有所帮助。 数据来源 教程…