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.mzph.cn/news/650850.shtml

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

相关文章

Optional lab: Linear Regression using Scikit-LearnⅠ

scikit-learn是一个开源的、可用于商业的机器学习工具包,此工具包包含本课程中需要使用的许多算法的实现 Goals In this lab you will utilize scikit-learn to implement linear regression using Gradient Descent Tools You will utilize functions from sci…

计算机设计大赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

MySQL DDL DML DQL DCL 通用语法

文章目录 DDL(数据定义语言)数据库操作表操作 DML(数据操作语言)添加数据注意事项 更新和删除数据 DQL(数据查询语言)基础查询条件查询聚合查询(聚合函数)分组查询排序查询分页查询D…

计算机网络:体系结构知识点汇总

文章目录 一、计算机网络概述1.1概念及功能1.2组成和分类1.3性能指标 二、体系结构与参考模型2.1分层结构、协议、接口、服务2.2OSI参考模型2.3TCP/IP参考模型 一、计算机网络概述 1.1概念及功能 计算机网络就是通过各个节点,这个节点包括终端的电脑,手…

C语言内联汇编和混合编程,及如何利用汇编提高C语言的性能和功能

一、什么是内联汇编和混合编程 内联汇编(inline assembly)是指在C语言源代码中嵌入汇编语言指令,从而实现C语言和汇编语言的混合编程(mixed programming)。混合编程可以利用汇编语言的优势,如直接访问硬件…

0127-2-Vue深入学习5—Vue-Router路由模式

1、Vue-Router三种路由模式: hash:#️⃣使用URL hash 值来做路由,支持所有路由器;history:📖依赖HTML5 History API和服务器配置;abstract:⛓支持所有JS运行环境,Node.js服务端; 1.1…

[网鼎杯 2018]Fakebook1

join一个用户后,点进去发现是这样的 查看这个页面的源代码,发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址,从而回显出来呢?当然,先按照常规sqli…

九、Kotlin 注解

1. 什么是注解 注解是对程序的附件信息说明。 注解可以作用在类、函数、函数参数、属性等上面。 注解的信息可用于源码级、编译期、运行时。 2. 注解类的定义 使用元注解 Retention 声明注解类的作用时期。 使用元注解 Target 声明注解类的作用对象。 定义注解类时可以声…

从二叉树角度来理解快速排序

“快速排序就是个二叉树的前序遍历” ——————labuladong 快速排序的逻辑 快速排序是先将一个元素排好序,然后再将剩下的元素排好序。 若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 …

Centos7 双机单网卡安装 OpenStack

虚拟机配置 1:准备虚拟机2台,配置如下 openstack master----192.168.20.205 2cpu,8G内存,200G硬盘,网络桥接方式--静态IP----单网卡 node1计算节点---192.168.20.215 2cpu,8G内存,200G硬盘&a…

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信

今年专业838信号与系统120,总分400,顺利上岸海南大学,这一年的复习起起伏伏,但是最后还是坚持下来的,吃过的苦都是值得,总结一下自己的复习经历,希望对大家复习有帮助。首先我想先强调一下专业课…

scrapy的概念作用和工作流程

1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted[twɪstɪd]异步网络框架,可以加快我们的下载速度。 Scrapy文档地址:http://scrapy-chs.readthedocs.io/zh_…

05 双向链表

目录 1.双向链表 2.实现 3.OJ题 4.链表和顺序表对比 1. 双向链表 前面写了单向链表,复习一下 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多作为其他数据结构的子结构,如哈希桶、图的邻接等。另外这种结构在…

dubbo和eureka的区别

dubbo可以作为客户端,也可以作为服务端,因此他内置了很多序列化框架可供选择,通过配置可以进行选择。默认是hession,还有gson,fastJson,jdk自带的序列化。 eureka只能作为服务端,他序列要与客户…

解析MySQL生产环境CPU使用率过高的排查与解决方案

引言 在生产环境中,MySQL作为一个关键的数据库组件,其性能对整个系统的稳定性至关重要。然而,有时候我们可能会遇到MySQL CPU使用率过高的问题,这可能导致系统性能下降,应用页面访问减慢,甚至影响到用户体…

编译与运行环境(C语言)

文章目录 前言编译环境编译链接 运行环境 前言 C语言代码的实现,存在两种不同的环境。 第一种是翻译环境,在这个环境中,源代码被转换为可执行的二进制指令。 翻译环境即我们日常使用编译器,将一个 " mission.c " 的文件…

软件包管理:在CentOS 7中部署Tengine

目录 下载: 方法一: 方法二: 部署: 实验操作 下载: 方法一: 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…

Matlab神经网络

Matlab神经网络 资料 拟合神经网络fitnet里面的函数 选择神经网络输入输出处理函数 MATLAB 创建神经网络模型的patternnet和newff函数区别 MATLAB中patternnet函数返回的网络结构中各个参数的含义 神经网络对象属性 径向基函数神经网络(RBFNN)详解 RBF网…

Python字符串:基础要点与实践应用

文章目录 一、Python字符串1.介绍2.与C语言字符串比较2.1 相同点2.2 不同点 3.创建Python字符串3.1 使用单引号3.2 使用双引号3.3 使用三引号 二、访问字符串中的值1.索引方式2.截取方式 三、Python 转义字符1.续行符\(在行尾时)2.反斜杠符号\\3.单引号\4.双引号\"5.响铃\…

使用Docker部署MySQL并结合内网穿透实现远程访问本地数据库

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…