Doris 与 Clickhouse 对比(一)

1. 常用引擎

☕️ Doris 表数据模型

  1. duplicate key

🎬 场景:适用于数据无需提前聚合的分析业务。

⚠️ 注意点:只指定排序列,相同的行并不会合并。

  1. unique key

🎬 场景:适用于有更新需求的业务。

⚠️ 注意点:key相同时,新记录覆盖旧记录。

  1. aggregate key

🎬 场景:可以提前聚合数据,适合报表和多维度业务。

⚠️ 注意点:

将会进行聚合操作,目前支持sum,min,max,replace 等

(1)sum:求和,多行的 value 进行累加。

(2)replace:替代,下一批数据中的 value 会替换之前导入过的行中的 value。

(3)max:保留最大值。

(4)min:保留最小值。

欢迎关注,一起学习

☕️ Clickhouse 表引擎

  1. *MergeTree

🎬 场景:

(1)支持索引和分区。

(2)支持生命周期TTL(列级 和表级)。

⚠️ 注意点:

(1)主键并不唯一,会建索引。

(2)order by 是必须的,主键、分区非必须。

  1. ReplacingMergeTree

🎬 场景:去重功能。

⚠️ 注意点:

(1)数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。

(2)如果表经过了分区,去重只会在分区内部进行去重,不能执行跨分区的去重。

(3)认定重复的数据保留,版本字段值最大的如果版本字段相同则按插入顺序保留最后一次。

  1. SummingMergeTree

🎬 场景:对于不查询明细,只关心以维度进行汇总聚合结果的场景。

⚠️ 注意点:

(1)以 order by 的列为准,作为维度列,其他的列按插入顺序保留第一行。

(2)不在一个分区的数据不会被聚合。

2. Join 方式

  • 查询速度和并发能力,单表性能ClickHouse更好。
  • 多表Join Doris优势更明显,特别是复杂Join和大表Join大表的场景。

首先了解下向量化引擎:核心思想就是一次处理一批数据,从而大大提高数据计算的速度,例如对于一列数据,我们通过向量化技术可以一次处理1000行数据,一次将这1000行数据做比较或者做加减运算,这种处理方式在列存数据库上尤其有效,因为列存数据库通常一列一列的将数据读取处理,在内存中都是以Array的形式存储,这种方式更容易使用向量化方式做计算。

☕️ Doris Join方式

  1. Broadcast Join

🎬 说明:默认Join,将小表加载到内存中,形成一张Hash内存表,然后将Hash表广播到大表所在的各个节点。

⚠️ 注意点:

如果小表数据过大,Doris将自动转换为Shuffle join。

  1. Shuffle Join

🎬 说明:小表数据无法放入内存则进行shuffle join。

⚠️ 注意点:

每个数据扫描节点将数据扫出来之后进行Partition 分区,然后根据 Partition 分区的结果分别把左右表的数据发送到对应的 Join 计算节点上。

  1. Bucket Shuffle Join

🎬 说明:

利用建表时候分桶的特性,当join的时候,join的条件和左表的分桶字段一样的时候,将右表按照左表分桶的规则进行shuffle操作,使右表中需要join的数据落在左表中需要join数据的BE节点上的join。

⚠️ 注意点:

(1)Join 条件为等值的场景才有效。

(2)需要左表的分桶列的类型与右表等值 join 列的类型需要保持一致。

(3)只作用于 Doris 原生的表,其他表比如,ES,MYSQL无效。

  1. Colocation Join

🎬 说明:

是将一组拥有相同 CGS 的 Table 组成一个 CG。保证这些 Table 对应的数据分片会落在同一个 BE 节点上。使得当 CG 内的表进行分桶列上的 Join 操作时,可以通过直接进行本地数据 Join。

两个概念:

(1)Colocation Group(CG):位置协同组。

(2)Colocation Group Schema (CGS): CG 中的 Table的元数据信息,比如:分桶列类型,分桶数以及分区的副本数等等信息。

⚠️ 注意点:

(1)建表时两张表的分桶列的类型和数量需要一致,保证多张表的数据分片能够一一对应分布控制。

(2)同一个 CG 内所有表的所有分区的副本数必须一致。如果不一致,可能出现某一个tablet 的某一个副本,在同一个 BE 上没有其他对应的表分片的副本。

(3)同一个 CG 内的表,分区的个数、范围以及分区列的类型不要求一致。

☕️ Clickhouse Join方式

  1. 普通 Join

🎬 步骤:假设集群有4个节点,2个分区,2个副本,其中data1、data2 节点为一个分片 shard1,data3、data4 为一个分片 shard2。执行的SQL语句如下:

SELECT l_.a, r_.aFROM left_all as l JOIN right_all as r 
on l_.a = r_.a

(1)Client发送data1节点上面的sql,准备执行

(2)data1节点会把自己本机表分片shard1数据left_local准备好,也即下面sql

当然,同理,data3也会把自己的left_local数据准备好

SELECT l_.a, r_.a FROM left_local as l JOIN right_all as r 
on l_.a = r_.a

(3)当data1与data3 要开始执行第二步中 join的右表,也是一个分布式表。这个时候,data1需要shard2中的右边表数据到本地,同理data3需要shard1中的右边数据到本地。这样这两个节点都有一份全量的right_all_local。

(4)节点data1,data3 left_local数据与right_all_local做计算。

SELECT l_.a, r_.a FROM left_local as l JOIN right_all_local as r 
on l_.a = r_.a

(5)data3执行完成以后,把结果发送到data1。

(6)data1收到数据,然后和自己计算数据做汇总,最后把结果给Client。

  1. Global Join

🎬 步骤:

还与普通Join不同的是,比如:

(1)data3节点将右表数据查询出来在data1上汇总为right_all_local。

(2)然后data1把right_all_local发送到data3上执行。

(3)data3的本地left_local数据与right_all_local计算好,发送到data1。

(4)data1收到数据,然后和自己计算数据做汇总,最后把结果给Client。

⚠️ 注意点:

(1)如果分片数为n,Global Join 右表本地表查询次数为n,而普通 Join 右表查询次数为n*n。这样可以减少读数据次数。

(2)数据在节点之间传播,占用部分网络流量。如果数据量较大,同样会带来性能损失。

3. 数据划分

☕️ Doris 数据划分

🎬 基本组成:

(1)Row & Column:一张表包括行(Row)和列(Column)。

(2)Tablet:Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶Bucket)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。

(3)Partition:多个 Tablet 在逻辑上归属于不同的分区(Partition)。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。

🎬 数据划分:

Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二层是 Bucket(Tablet),支持 Hash 和 Random 的划分方式。

⚠️ 官方给出的注意点:

(1)一个表的 Tablet 总数量等于 (Partition num * Bucket num),在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。

(2)单个 Tablet 的数据量建议在 1G - 10G 的范围内。

(3)一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。

(4)官方举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个分片。5GB:8-16个分片。50GB:32个分片。500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。

☕️ Clickhouse 数据划分

🎬 数据分片

分片策略:

(1)random随机分片:写入数据会被随机分发到分布式集群中的某个节点上。

(2) constant固定分片:写入数据会被分发到固定一个节点上。

(3) column value分片:按照某一列的值进行hash分片。

(4) 自定义表达式分片:根据表达式的值进行hash分片。

🎬 数据分区

分区设计:

(1)不指定分区键,则数据默认不分区,所有数据写到一个默认分区a里面。

(2)如果分区键取值属于整型,则直接按照该整型的字符形式输出作为分区ID的取值。

(3)如果分区键取值属于日期类型,或者是能够转换为YYYYMMDD日期格式的整型,则按照分区表达式逻辑格式化后作为分区ID的取值。

(4)如果分区键取值既不属于整型或日期类型,则通过128位Hash算法取其Hash值作为分区ID的取值。

(5)分区键也可以是表达式的tuple元组。

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

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

相关文章

心灵鸡汤美文:温暖你的每一寸心田

1.人生就像一杯茶,不会苦一辈子,但总会苦一阵子。只有经历过苦涩,才能品味到甜美的滋味。 2.每一次失败都是一次宝贵的经验,它教会我们如何更好地面对困难和挑战。不要害怕失败,因为失败是成功的前奏。 3.人生最重要的…

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目,Message Nest - 可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。 开源地址: https://github.com/engigu/Message-Push-Nest 测试平台 系统&am…

工业级数据采集通用网关在生产过程中的实际应用及其解决的问题-天拓四方

在工业生产过程中,实时数据是评估设备性能、监控生产流程、预测潜在问题以及优化资源配置的关键。数据采集不仅有助于提高生产效率,降低故障率,还可以为企业的决策提供科学依据。因此,选择一款高效、稳定的数据采集网关是至关重要…

使用nginx对视频、音频、图片等静态资源网址,加token签权

目前很多静态资源,都可以无权限验证,进行访问或转发,对有价值的资源进行签权,限制转发无法在代码中实现拦截,我们可以使用nginx对视频、音频、图片等静态资源网址,加token签权 如: http://192…

2024年新提出的算法:(凤头豪猪优化器)冠豪猪优化算法Crested Porcupine Optimizer(附Matlab代码)

本次介绍一种新的自然启发式元启发式算法——凤头豪猪优化器(Crested Porcupine Optimizer,CPO)。该成果于2024年1月发表在中科院1区SCI top期刊Knowledge-Based Systems(IF 8.8)上。 1、简介 受到凤头豪猪(CP)各种…

将 Quartz.NET 调度框架与 Stimulsoft Reports 结合使用

今天,我们将深入探讨软件开发的一种现代趋势 - 流程自动化,这自然是 Stimulsoft 产品中报表处理的一部分。在本文中,我们将讨论如何使用第三方调度程序自动执行与 Web 项目中的报告相关的任务。作为对报告执行操作的示例,我们考虑…

Hive 行列转换

行列转换 列转行 使用 lateral view explode(array|map) 或 lateral view inline(array_struct) 可以将列转换为行。 单列转多行,降维(单列数组或键值对) 示例1:explode(array(…)) select ..., A from T lateral view exp…

博云科技与中科可控全面合作,探索前沿金融科技新机遇

2024年1月26日,博云科技与中科可控在昆山高新区成功举办合作签约仪式。昆山市委常委、昆山高新区党工委书记孙道寻、中科可控董事长聂华、博云科技董事长花磊等领导出席了本次签约仪式。 中科可控将利用其在先进计算和智造领域的优势,为博云科技提供有关…

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…

多线程代码案例之单例模式

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 多线程代码案例之单例模式 单例…

linux_ftp客户端如何带有密码下载文件

目录 简介linux 使用密码登录ftplinux 客户端指定密码下来文件下载成功截图 简介 当我们使用linux 的ftp 客户端想从服务端下载一个文件的时候 又不会指定密码 应该如何处理呢 linux 使用密码登录ftp # 语法 lftp -u {ftp账号},{ftp密码} ftp://{服务器IP}:{端口}# 实例使用…

蓝桥杯 第 1 场 小白入门赛

目录 1.蘑菇炸弹 2.构造数字 3.小蓝的金牌梦 4.合并石子加强版 5.简单的LIS问题 6.期望次数 1.蘑菇炸弹 我们直接依照题目 在中间位置的数进行模拟即可 void solve(){cin>>n;vector<int> a(n1);for(int i1;i<n;i) cin>>a[i];int ans0;for(int i2;i…

02-opencv简单实例效果和基本介绍-上

机器视觉概述 机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素…

Consul容器服务自动发现和更新

目录 前瞻 什么是服务注册与发现 什么是consul Docker-consul实现过程 Docker-consul集群部署 实验准备 实验流程 前瞻 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服…

MyBatis常见面试题汇总

说一下MyBatis执行流程&#xff1f; MyBatis是一款优秀的基于Java的持久层框架&#xff0c;它内部封装了JDBC&#xff0c;使开发者只需要关注SQL语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接等的过程&#xff0c;MyBatis的执行流程如下&#xff1a; 加载配…

华为radius认证

组网需求 如图1所示&#xff0c;用户同处于huawei域&#xff0c;Router作为目的网络接入服务器。用户需要通过服务器的远端认证才能通过Router访问目的网络。在Router上的远端认证方式如下&#xff1a; Router对接入用户先用RADIUS服务器进行认证&#xff0c;如果认证没有响应…

第七篇:node中间件详解

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 引言&#xff1a; &#…

解读4篇混合类型文件Polyglot相关的论文

0. 引入 Polyglot文件指的是混合类型文件&#xff0c;关于混合类型文件的基础&#xff0c;请参考文末给出的第一个链接&#xff08;参考1&#xff09;。 1. Toward the Detection of Polyglot Files 1.1 主题 这篇2022年的论文&#xff0c;提出了Polyglot文件的检测方法。虽…

MySQL 联合索引

文章目录 1.简介2.最左匹配3.最左匹配原理4.如何建立联合索引?5.覆盖索引参考文献 1.简介 联合索引指建立在多个列上的索引。 MySQL 可以创建联合索引&#xff08;即多列上的索引&#xff09;。一个索引最多可以包含 16 列。 联合索引可以测试包含索引中所有列的查询&#…

十一、常用API——练习

常用API——练习 练习1 键盘录入&#xff1a;练习2 算法水题&#xff1a;练习3 算法水题&#xff1a;练习4 算法水题&#xff1a;练习5 算法水题&#xff1a; 练习1 键盘录入&#xff1a; 键盘录入一些1~100之间的整数&#xff0c;并添加到集合中。 直到集合中所有数据和超过2…