Apache Doris 2.0 如何实现导入性能提升 2-8 倍
数据导入吞吐是 OLAP 系统性能的重要衡量标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。随着 Apache Doris 用户规模的不断扩大, 越来越多用户对数据导入提出更高的要求,这也为 Apache Doris 的数据导入能力带来了更大的挑战。
为提供快速的数据写入支持,Apache Doris 存储引擎采用了类似 LSM Tree 结构。在进行数据导入时,数据会先写入 Tablet 对应的 MemTable 中,MemTable 采用 SkipList 的数据结构。当 MemTable 写满之后,会将其中的数据刷写(Flush)到磁盘。数据从 MemTable 刷写到磁盘的过程分为两个阶段,第一阶段是将 MemTable 中的行存结构在内存中转换为列存结构,并为每一列生成对应的索引结构;第二阶段是将转换后的列存结构写入磁盘,生成 Segment 文件。
具体而言,Apache Doris 在导入流程中会把 BE 模块分为上游和下游,其中上游 BE 对数据的处理分为 Scan 和 Sink 两个步骤:首先 Scan 过程对原始数据进行解析,然后 Sink 过程将数据组织并通过 RPC 分发给下游 BE。当下游 BE 接收数据后,首先在内存结构 MemTable 中进行数据攒批,对数据排序、聚合,并最终下刷成数据文件(也称 Segment 文件)到硬盘上来进行持久化存储。
而我们在实际的数据导入过程中,可能会出现以下问题:
- 因上游 BE 跟下游 BE 之间的 RPC 采用 Ping-Pong 的模式,即下游 BE 一个请求处理完成并回复到上游 BE 后,上游 BE 才会发送下一个请求。如果下游 BE 在 MemTable 的处理过程中消耗了较长的时间,那么上游 BE 将会等待 RPC 返回的时间也会变长,这就会影响到数据传输的效率。
- 当对多副本的表导入数据时,需要在每个副本上重复执行 MemTable 的处理过程。然而,这种方式使每个副本所在节点都会消耗一定的内存和 CPU 资源,不仅如此,冗长的处理流程也会影响执行效率。
为解决以上问题,我们在刚刚发布不久 Apache Doris 2.0 版本中(https://github.com/apache/doris/tree/2.0.1-rc04 ),对导入过程中 MemTable 的攒批、排序和落盘等流程进行优化,提高了上下游之间数据传输的效率。此外我们在新版本中还提供 “单副本导入” 的数据分发模式,当面对多副本数据导入时,无需在多个 BE 上重复进行 MemTable 工作,有效提升集群计算和内存资源的利用率,进而提升导入的总吞吐量。
MemTable 优化
01 写入优化
在 Aapche Doris 过去版本中,下游 BE 在写入 MemTable 时,为了维护 Key 的顺序,会实时对 SkipList 进行更新。对于 Unique Key 表或者 Aggregate Key 表来说,遇到已经存在的 Key 时,将会调用聚合函数并进行合并。然而这两个步骤可能会消耗较多的处理时间,从而延迟 RPC 响应时间,影响数据写入的效率。
因此我们在 2.0 版本中对这一过程进行了优化。当下游 BE 在写入 MemTable 时,不再实时维护 MemTable 中 Key 的顺序,而是将顺序的保证推迟到 MemTable 即将被下刷成 Segment 之前。此外,我们采用更高效的 pdqsort 来替代 std::sort ,实现了缓存友好的列优先排序方式,并取得了更好的排序性能。通过上述两种手段来保证 RPC 能够被及时响应。
02 并行下刷
在导入过程中,当下游 BE 将一个 MemTable 写入一定大小之后,会把 MemTable 下刷为 Segment 数据文件来持久化存储数据并释放内存。为了保证前文提到的 Ping-Pong RPC 性能不受影响,MemTable 的下刷操作会被提交到一个线程池中进行异步执行。
在 Apache Doris 过去版本中,对于 Unique Key 的表来说,MemTable 下刷任务是串行执行的,原因是不同 Segment 文件之间可能存在重复 Key,串行执行可以保持它们的先后顺序,而 Segment 序号是在下刷任务被调度执行时分配的。同时,在 Tablet 数量较少无法提供足够的并发时,串行下刷可能会导致系统的 IO 资源无法重复被利用。而在 Apache Doris 2.0 版本中,由于我们将 Key 的排序和聚合操作进行了后置,除了原有的 IO 负载以外,下刷任务中还增加了 CPU 负载(即后置的排序和聚合操作)。此时若仍使用串行下刷的方式,当没有足够多 Tablet 来保证并发数时,CPU 和 IO 会交替成为瓶颈,从而导致下刷任务的吞吐量大幅降低。
为解决这个问题,我们在下刷任务提交时就为其分配 Segment 序号,确保并行下刷后生成的 Segment 文件顺序是正确的。同时,我们还对后续 Rowset 构建流程进行了优化,使其可以处理不连续的 Segment 序号。通过以上改进,使得所有类型的表都可以并行下刷 MemTable,从而提高整体资源利用率和导入吞吐量。
03 优化效果
通过对 MemTable 的优化,面对不同的导入场景,Stream Load 的吞吐量均有不同幅度的提升(详细对比数据可见下文)。这项优化不仅适用于Stream Load ,还对 Apache Doris 支持的其他导入方式同样有效,例如 Insert Into、Broker Load、S3 Load 等,均在不同程度提升了导入的效率及性能。
单副本导入
01 原理和实现
在过去版本中,当面对多副本数据写入时,Apache Doris 的每个数据副本均需要在各自节点上进行排序和压缩,这样会造成较大的资源占用。为了节约 CPU 和内存资源,我们在 Apache Doris 在 2.0 版本中提供了单副本导入的能力,该能力会从多个副本中选择一个副本作为主副本(其他副本为从副本),且只对主副本进行计算,当主副本的数据文件都写入成功后,通知从副本所在节点直接接拉取主副本的数据文件,实现副本间的数据同步,当所有从副本节点拉取完后进行返回或超时返回(大多数副本成功即返回成功)。该能力无需一一在节点上进行处理,减少了节点的压力,而节约的算力和内存将会用于其它任务的处理,从而提升整体系统的并发吞吐能力。
02 如何开启
FE 配置:
enable_single_replica_load = true
BE 配置:
enable_single_replica_load = true
环境变量(insert into)
SET experimental_enable_single_replica_insert=true;
03 优化效果
- 对于单并发导入来说,单副本数据导入可以有效降低资源消耗。单副本导入所占的内存仅为三副本导入的 1/3(单副本导入时只需要写一份内存,三副本导入时需要写三份内存)。同时从实际测试可知,单副本导入的 CPU 消耗约为三副本导入的 1/2,可有效节约 CPU 资源。
- 对于多并发导入来说,在相同的资源消耗下,单副本导入可以显著增加任务吞吐。同时在实际测试中,同样的并发导入任务, 三副本导入方式耗时 67 分钟,而单副本导入方式仅耗时 27 分钟,导入效率提升约 2.5 倍。具体数据请参考后文。
性能对比
测试环境及配置:
- 3 个 BE (16C 64G),每个 BE 配置 3 块盘 (单盘读写约 150 MB/s)
- 1 个 FE,共享其中一个 BE 的机器
原始数据使用 TPC-H SF100 生成的 Lineitem 表,存储在 FE 所在机器的一个独立的盘上(读约 150 MB/s)。
01 Stream Load(单并发)
以上述列举的单并发场景来说,Apache Doris 2.0 版本整体的导入性能比 1.2.6 版本提升了 2-7 倍;在多副本前提下,开启新特性单副本导入,导入性能提升了 2-8 倍。
02 INSERT INTO (多并发)
以上述列举的多并发场景来说,Apache Doris 2.0 版本整体比 1.2.6 版本有小幅提升;开启新特性单副本导入后,对在多副本提导入性能提升效果明显,导入速度较 1.2.6 版提升约 50% 。
结束语
社区一直致力于提升 Apache Doris 导入性能这一核心能力,为用户提供更佳的高效分析体验,通过在 2.0 版本对 Memtable、单副本导入等能力进行优化,导入性能相较于之前版本已经呈现数倍提升。未来我们还将在 2.1 版本中持续迭代,结合 MemTable 的优化方法、单副本优化资源能效理念,以及基于 Streaming RPC 优化后的 IO 模型和精简的 IO 路径对导入性能进一步优化,同时减少导入对查询性能的影响,为用户提供更加卓越的数据导入体验。
# 作者介绍:
陈凯杰,SelectDB 高级研发工程师
张正宇,SelectDB 资深研发工程师
相关文章:
Apache Doris 2.0 如何实现导入性能提升 2-8 倍
数据导入吞吐是 OLAP 系统性能的重要衡量标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。随着 Apache Doris 用户规模的不断扩大, 越来越多用户对数据导入提出更高的要求,这也为 Apache Doris 的数据导入能力带来了更大的挑战…...
RabbitMQ: topic 结构
生产者 package com.qf.mq2302.topic;import com.qf.mq2302.utils.MQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class Pubisher {public static final String EXCHANGE_NAME"mypubilisher";public static void ma…...
信息系统项目管理教程(第4版):第二章 信息技术及其发展
请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 第二章 信息技术及其发展 2.1信息技术及其发展 信息技术是以微电子学为基础的计算机技术和电信技术的结合而形成的,对声音的、图像的、文字的、数字…...
有哪些适合初学者的编程语言?
C语言 那为什么我还要教你C语言呢?因为我想要让你成为一个更好、更强大的程序员。如果你要变得更好,C语言是一个极佳的选择,其原因有二。首先,C语言缺乏任何现代的安全功能,这意味着你必须更为警惕,时刻了…...
uni-app动态tabBar,根据不同用户展示不同的tabBar
1.uni框架的api实现 因为我们用的是uni-app框架开发,所以在创建项目的时候直接创建uni-ui的项目即可,这个项目模板中自带了uni的一些好用的组件和api。 起初我想着这个效果不难实现,因为官方也有api可以直接使用,所以我最开始尝试…...
手写Spring:第6章-资源加载器解析文件注册对象
文章目录 一、目标:资源加载器解析文件注册对象二、设计:资源加载器解析文件注册对象三、实现:资源加载器解析文件注册对象3.1 工程结构3.2 资源加载器解析文件注册对象类图3.3 类工具类3.4 资源加载接口定义和实现3.4.1 定义资源加载接口3.4…...
Redis 7 第八讲 集群模式(cluster)架构篇
集群架构 Redis 集群架构图 集群定义 Redis 集群是一个提供在多个Redis节点间共享数据的程序集;Redis集群可以支持多个master 应用场景 Redis集群支持多个master,每个master又可以挂载多个slave读写分离支持数据的高可用支持海量数据的读写存储操作集群自带Sentinel的故障…...
【PowerQuery】导入与加载XML
在标准数据格式类型里面,有一类比较特殊的数据类型,就是层次结构数据。层次结构数据和标准的结构型数据方式完全不同,在实际应用过程中使用最为频繁的几种数据类型如下。 XML数据格式Json 数据格式Yaml 数据格式我们将在本节和大家一起分享下XML格式数据集成,下一节和大家分…...
vue 预览视频
1.预览本地文件 1.1 直接给video或者embed的src赋值本地路径 <video :src"videoUrl"></video> // 或者 使用embed标签<embed :src"videoUrl" /> 1.2 读取文件流形式 <input type"file" ref"file" /> <vi…...
4个维度讲透ChatGPT技术原理,揭开ChatGPT神秘技术黑盒!(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
【无标题】@Scheduled 的cron
, :指定多个值。 -:表示一个区间。 / :指定一个值的增加幅度。n/m表示从n开始,每次增加m。 L:是last的缩写,表示最后一天,用在日表示一个月中的最后一天,用在周表示每周最后一天&…...
IP和MAC的作用区别
在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为 MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址&…...
python趣味编程-数独游戏
数独游戏是一个用Python编程语言编写的应用程序。该项目包含可以显示实际应用程序的基本功能。该项目可以让修读 IT 相关课程并希望开发简单应用程序的学生受益。这个Python 数独游戏是一个简单的项目,可用于学习tkinter库的实践。这个数独游戏可以提供Python编程的基本编码技…...
MySQL/MariaDB 查询某个 / 多个字段重复数据
创建测试表和数据 # 创建表 create table if not exists t_duplicate (name varchar(255) not null,age int not null );# 插入测试数据 insert into t_duplicate(name, age) values(a, 1); insert into t_duplicate(name, age) values(a, 2);查询单个字段重复 使用 count() …...
【力扣每日一题】2023.9.10 课程表Ⅱ
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 今天的题目和昨天类似,不过今天要我们求出学习所有课程的先后顺序。 昨天只需要我们求出能否学习完所有课程,因此…...
VSCODE CMAKE C++ 工程调试, C++不以科学计数法输出并控制小数位数
1. VSCODE调试CMAKE工程配置1.1 修改CMakeLists.txt文件1.2. 程序中1.3. launch.json配置1.4 开始调试1.5 注意 2. C设置输出浮点数且保留位数固定 1. VSCODE调试CMAKE工程配置 1.1 修改CMakeLists.txt文件 加这一句 set(CMAKE_BUILD_TYPE "Debug")1.2. 程序中 在…...
Drools规则引擎入门学习记录
业务开发过程中,对于某些判断性的通用规则是基于if-else封装,还是基于策略模式封装?无论以上那种封装出来的方法,只能在单体软件包中共用,且不能无感部署,然而对于业务而言,可能规则改变的比较频…...
肖sir__设计测试用例方法之判定表06_(黑盒测试)
设计测试用例方法之判定表 1、判定表:是一种表达逻辑判断的工具。 2、判定表:包含四部分 1)条件桩(condition stub):列出问题的 所有条件(通常条件次序无关紧要)。 2)条件项&#x…...
<图像处理> 空间滤波基础
空间滤波基础 图像滤波是一种常见的图像处理技术,用于平滑图像、去除噪音和边缘检测等任务。图像滤波的基本原理是在进行卷积操作时,通过把每个像素的值替换为该像素及其邻域的设定的函数值来修改图像。 预备知识:可分离滤波核、边缘填充。…...
如何在Django中使用django-crontab启动定时任务、关闭任务以及关闭指定任务
安装django-crontab包: pip install django-crontab 在Django项目的settings.py文件中,找到INSTALLED_APPS配置,并添加django_crontab到列表中: INSTALLED_APPS [ ... django_crontab,... ] 在settings.py文件的末尾,添加以下配置以设…...
mysql配置项整理
二、:mysql服务器参数 general 基础配置 datadir/var/lib/mysql #数据文件存放的目录 socket/var/lib/mysql/mysql.sock #mysql.socket表示server和client在同一台服务器,并且使用localhost进行连接,就会使用socket进行连接 pid_file/v…...
【KRouter】一个简单且轻量级的Kotlin Routing框架
【KRouter】一个简单且轻量级的Kotlin Routing框架 KRouter(Kotlin-Router)是一个简单而轻量级的Kotlin路由框架。 具体来说,KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下: val homeScreen KRouter.route&l…...
时间管理类书籍阅读笔记
背景 这段时间看了时间管理方面的书籍,大部分和早晨时间利用相关。之所以有了利用早晨时间的想法,是某天下班后,感觉很疲惫,什么都不想做,于是就打了一晚上游戏,然后第二天重复着这样的生活。 突然意识到…...
CSS文字居中对齐学习
CSS使用text-align属性设置文字对齐方式;text-align:center,这样就设置了文字居中对齐; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css 水平居中</title><style>.box …...
《论文阅读》CARE:通过条件图生成的共情回复因果关系推理 EMNLP 2022
《论文阅读》CARE:通过条件图生成的移情反应因果关系推理 前言简介基础知识TransformerVariational Graph Auto-Encoder 变分图自编码器`邻接矩阵(adjacency matrix)``图神经网络(GNN)``图卷积神经网络(GCN)``自编码器(Auto Encoder)``图自编码器(GAE)``变分图自编码…...
React 开发一个移动端项目(1)
技术栈: 项目搭建:React 官方脚手架 create-react-appreact hooks状态管理:redux 、 redux-thunkUI 组件库:antd-mobileajax请求库:axios路由:react-router-dom 以及 historyCSS 预编译器:sass…...
c#查看代码的执行耗时( Stopwatch )
我们如果需要看某段代码的执行耗时,会通过如下的方式进行查看 using System.Diagnostics; private void button1_Click(object sender, EventArgs e){Stopwatch sw Stopwatch.StartNew();//sw.Start();StringBuilder sb new StringBuilder();for(int i 0; i <…...
Python网络爬虫库:轻松提取网页数据的利器
网络爬虫是一种自动化程序,它可以通过访问网页并提取所需的数据。Python是一种流行的编程语言,拥有许多强大的网络爬虫库。在本文中,我们将介绍几个常用的Python网络爬虫库以及它们的使用。 Requests库 Requests是一个简单而优雅的HTTP库&…...
YOLOv5算法改进(15)— 更换Neck之AFPN
前言:Hello大家好,我是小哥谈。在YOLOv5中添加AFPN(Adaptive Feature Pyramid Network)可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块,它能够自适应地融合来自不同层级的特征图,以提…...
Vue2项目练手——通用后台管理项目第七节
Vue2项目练手——通用后台管理项目 用户管理分页使用的组件Users.vuemock.js 关键字搜索区Users.vue 权限管理登录页面样式修改Login.vue 登录权限使用token对用户鉴,使用cookie对当前信息保存(类似localstorage)Login.vuerouter/index.js 登…...
wordpress全站301/市场营销推广方案模板
点击上方"brucepk",选择"置顶公众号"第一时间关注 Python 技术干货!阅读文本大概需要 3 分钟。自从 pk哥开始认真在公众号分享文章以来,目前已分享了 45 篇原创文章, 昨晚花了几小时对公众号文章进行了整理&a…...
thinkphpcmf网站开发/seo的重要性
Android Studio Profiler 检查内存简单介绍 如何使用? 第一步:点击Profiler按钮 第二步:选择 第三步:选择Capture heap dump 并点击Record 解释相关按钮的功能 垃圾桶按钮:用于强制执行垃圾回收事件的按钮ÿ…...
海报设计论文/做专业搜索引擎优化
微软公司预计在2010年一月份(09年10月24日已经全球发布)推出Windows 7 ,但由于要先发行预测版,可能真正发布时间要迟些。为什么新的操作系统叫Windows 7呢?我们都知道有个Windows NT,但现在好像没谁平时还在说,都在说X…...
电商系统功能模块/山西搜索引擎优化
接下来我们在 Centos7 系统下使用 yum 命令安装 MySQL,需要注意的是 CentOS 7 版本中 MySQL数据库已从默认的程序列表中移除,所以在安装前我们需要先去官网下载 Yum 资源包,下载地址为:https://dev.mysql.com/downloads/repo/yum/…...
标题制作网站/100%能上热门的文案
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1次的长度变量即可 代码: 1 #include<iostream>2 #i…...
电商运营主要做什么工作/网站运营推广选择乐云seo
51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。具体定义如下: 如果一个数包含平方因子,那么miu(n) 0。例如…...