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元组。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink 集成 Debezium Confluent Avro ( format=debezium-avro-confluent )

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

数据结构——链式二叉树(2)

目录 🍁一、二叉树的销毁 🍁二、在二叉树中查找某个数,并返回该结点 🍁三、LeetCode——检查两棵二叉树是否相等 🌕(一)、题目链接:100. 相同的树 - 力扣(LeetCode&a…

私有化部署ASR的方案,优缺点

私有化部署自动语音识别(ASR)系统的方案具有一些优点和缺点,下面苏州磐石云提出一些常见的优缺点: 优点: 数据隐私和安全性:私有化部署ASR系统可以确保数据在本地环境中进行处理和存储,更好地保…

《动手学深度学习(PyTorch版)》笔记4.5

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…

Notepad在文件中查找多行相同内容的文字

Notepad在文件中查找多行相同的内容 查找:打开 Notepad软件, Ctrl F 查找 。输入关键词, 点击【在当前文件中查找】。 复制:直接在下方的【搜索结果】复制。 Notepad提取含有特定字符串的行 详情见: https://blog…

[HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

IndexedDB

Web SQL Database | Can I use... Support tables for HTML5, CSS3, etc IndexedDB | Can I use... Support tables for HTML5, CSS3, etc 为什么websql被废弃?_笔记大全_设计学院 WebSQL有兼容、性能、安全问题,要考虑使用IndexedDB替代。 一文看懂 In…

上位机图像处理和嵌入式模块部署(极致成本下的图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 目前,大家都习惯了特定的图像处理方式,要么是windows上位机来处理,要么是arm soc来进行处理,要么是…

远程git开发

两种本地与远程仓库同步 """ 1)你作为项目仓库初始化人员:线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push)2)你作为项目后期开发人员:远程项目仓库已经创…

快速恢复区域 - 空间管理警告和警报(文档 ID 305812.1)

快速恢复区域 - 空间管理警告和警报(文档 ID 305812.1)

Stable Diffusion插件Recolor实现黑白照片上色

今天跟大家分享一个使用Recolor插件通过SD实现老旧照片轻松变彩色,Recolor翻译过来的含义就是重上色,该模型可以保持图片的构图,它只会负责上色,图片不会发生任何变化。 一:插件下载地址 https://github.com/pkuliyi…

pinctrl子系统与gpio子系统实验-测试Led驱动框架代码

一. 简介 上一篇文章学习编写了 led驱动框架代码,并正常编译通过。文章地址如下: pinctrl子系统与gpio子系统实验-Led驱动框架代码实现-CSDN博客 本文对上一篇文章编写的驱动框架代码进行测试。测试方法与之前的驱动模块的测试方法一样。 二. 测试Le…

快速上手!使用Docker和Nginx部署Web服务的完美指南

前言 Docker是一种容器化技术,它可以将应用程序及其依赖项打包到一个独立的、可移植的容器中。这意味着开发人员可以在任何环境中轻松部署和运行他们的应用程序,而无需担心环境差异和依赖问题。而Nginx则是一款高性能的Web服务器和反向代理服务器&#x…

Chapter 8 - 1. Congestion Management in TCP Storage Networks

This chapter covers the following topics. 本章包括以下主题。 Understanding congestion in TCP storage networks. Detecting congestion in TCP storage networks. Traffic patterns with iSCSI and NVMe/TCP and correlation with network congestion. Preventing co…

Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。 在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像&…

C++版QT:分割窗口

目录 mainwindow.h mainwindow.cpp main.cpp Qt的分割窗口功能允许用户将一个窗口分割成多个区域,每个区域可以独立地显示不同的内容。这种功能在许多应用程序中非常有用,例如编辑器、浏览器和IDE等。 理解Qt的分割窗口,需要从以下几个方面…

SQL注入流程与常用语句

FLAG:别来我梦里了,我已负担不起醒来的失落 专研方向: Mysql,sql注入 每日emo:好久不见,寒暄几句,缺耗尽了半生的勇气 欢迎各位与我这个菜鸟交流学习 SQL注入流程与常用语句 1、判断注入类型,数…

华为三层交换机之基本操作

Telnet简介 Telnet是一个应用层协议,可以在Internet上或局域网上使用。它提供了基于文本的远程终端接口,允许用户在本地计算机上登录到远程计算机,然后像在本地计算机上一样使用远程计算机的资源。Telnet客户端和服务器之间的通信是通过Telnet协议进行的…

element-UI上传文件后valid提示不消失

问题描述&#xff1a;上传文件完成后&#xff0c;必填信息提示不消失 解决方法&#xff1a;在<el-form-item>标签添加show-message属性&#xff0c;字段为空时才显示提示信息 <el-form-item :prop"fileList" :show-message"!form.fileList || !form.f…

web服务和前端交互相关的上中游业务技术知识点梳理

文章目录 前言一、业务API网关鉴权Cookie Session 实现 API 鉴权API Key API Secrettoken 机制实现 API 鉴权 二、Tomcat、Servlet、SpringMVC总结 前言 可能之前在学校里面做的很多东西是纯后端的&#xff0c;不会涉及到太多和前端交互的细节&#xff0c;很多新手对前后端交…