第6.4章:StarRocks查询加速——Colocation Join

news2025/1/20 19:16:07

目录

一、StarRocks数据划分

1.1 分区

1.2 分桶

二、Colocation Join实现原理

2.1 Colocate Join概述

2.2 Colocate Join实现原理

三、应用案例

注:本篇文章阐述的是StarRocks-3.2版本的Colocation Join

官网文章地址:

Colocate Join | StarRocks

一、StarRocks数据划分

    在介绍Colocation Join之前,再回顾下StarRocks的数据划分及tablet多副本机制。

   StarRocks支持两层的数据划分,第一层是Range  Partition,第二层是Hash  Bucket(Tablet)。StarRocks的数据表按照分区分桶规则,被水平切分成若干个数据分片(Tablet,也称作数据分桶 Bucket)存储在不同的be节点上,每个tablet都有多个副本(默认是3副本)。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。Tablet 是数据移动、复制等操作的最小物理存储单元。 一个 Tablet 只属于一个数据分区(Partition),而一个 Partition 包含若干个 Tablet。

   下图说明 Table、Partition、Bucket(Tablet) 的关系:

  • 假设Table 按照 Range 的方式按照 date 字段进行分区,得到了 N 个 Partition

  • 每个 Partition 通过相同的 Hash 方式将其中的数据划分为 M 个 Bucket(Tablet)

  • 从逻辑上来说,Bucket 1 可以包含 N 个 Partition 中划分得到的数据,比如下图中的 Tablet 11、Tablet 21、Tablet N1

1.1 分区

    逻辑概念,分区用于将数据划分成不同的区间,主要作用是将一张表按照分区键拆分成不同的管理单元。查询时,通过分区裁剪,可以减少扫描的数据量,显著优化查询性能。

1.2 分桶

    物理概念,StarRocks一般采用Hash算法作为分桶算法。在同一分区内,分桶键哈希值相同的数据会划分到同一个tablet(数据分片),tablet以多副本冗余的形式存储,是数据均衡和恢复的最⼩单位,数据导入和查询最终都下沉到所涉及的 tablet副本上。

二、Colocation Join实现原理

2.1 Colocate Join概述

      在数据分布满足一定条件的前提下,计算节点只需做本地 Join,减少跨节点的数据移动和网络传输开销,提高查询性能。Colocate Join 十分适合几张大表按照相同字段分桶的场景,这样可以将数据预先存储到相同的分桶中,实现本地计算。

    要理解这个算法,需要先了解以下几个概念:

  •  Colocation Group(CG):同一 CG 内的表需遵循相同的 Colocation Group Schema(CGS),即表对应的分桶副本具有一致的分桶键、副本数量和副本放置方式。如此可以保证同一 CG 内,所有表的数据分布在相同一组 BE 节点上。
  • Colocation Group Schema(CGS):用于描述一个 CG 中的Table,和Colocation相关的通用 Schema 信息。包括分桶列类型,分桶数以及副本数等。
  • 分桶编号Bucket Seq:一个表的数据,根据分桶列 Hash、对桶数取模后落在某一个分桶内。假设一个 Table 的分桶数为 8,则共有 [0, 1, 2, 3, 4, 5, 6, 7] 8 个分桶(Bucket)。因此【分桶列 Hash %桶数 】一致的数据会划分到同一个桶中。

2.2 Colocate Join工作原理

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

  因此核心问题直接转变成【如果保证这些table对应的数据分片会落在同一个be节点上?】

  同一 CG 内的Table必须保证以下属性:

 (1)分桶列和分桶数

   同一 CG内表的分桶键的类型、数量和顺序完全一致,并且桶数一致,从而保证多张表的数据分片能够一一对应地进行分布控制。

   分桶列,即在建表语句中distributed by hash(col1, col2, ...) 中指定的列。分桶列决定了一张表的数据通过哪些列的值进行Hash划分到不同的Tablet 中。同一 CG内的 Table 必须保证分桶列的类型和数量完全一致,并且桶数一致,才能保证多张表的数据分片能够一一对应的进行分布控制。

(2)副本数

  同一个 CG内所有表的所有分区(Partition)的副本数必须一致。如果不一致,可能出现某一个 Tablet 的某一个副本,在同一个 BE 上没有其他的表分片的副本对应。不过,同一个 CG 内的表,分区的个数、范围以及分区列的类型不要求一致。

   ps:同一个 CG 内所有表的分区键,分区数量可以不同。因为Partition只是一个逻辑上的分区,真正影响数据分布在哪一个BE节点的是由Bucket决定的。

    综上,在固定了分桶列和分桶数后,同一个CG内的表会拥有相同的Buckets Seq。而副本数决定了每个分桶内的 Tablet 的多个副本分别存放在哪些 BE 上。假设Buckets Seq为 [0, 1, 2, 3, 4, 5, 6, 7],BE 节点有 [A, B, C, D] 4个。则一个可能的数据分布如下:

    CG 内表的一致的数据分布定义和tablet副本映射,能够保证分桶列值相同的数据都在同一个 BE 节点上,可以进行本地数据 Join。其核心思想是「两次映射」,保证相同的 Distributed Key 的数据会被映射到相同的 Bucket Seq,再保证 Bucket Seq对应的 Bucket 映射到相同的 BE 节点:

三、应用案例

    Colocation Join的使用案例见官网:

Colocate Join | StarRocks本小节介绍如何使用 Colocate Join。icon-default.png?t=N7T8https://docs.starrocks.io/zh/docs/3.1/using_starrocks/Colocate_join/

参考文章:

Apache Doris的Colocation join本地join实现_colocation 怎么做-CSDN博客

Apache Doris的Colocation join本地join实现_colocation 怎么做-CSDN博客

系统架构 | StarRocks

第2.9章:StarRocks表设计--Colocation Join_show colocation_group-CSDN博客

Colocate Join | StarRocks

Apache Doris Join 优化原理介绍 - 掘金

编程小梦|Apache Doris Colocate Join 原理与实践

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

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

相关文章

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的,Arrays是操作数组的工具类,它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下:遍历、拷贝、排序等操作。需要用到的方法如下 public…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

音视频数字化(数字与模拟-电影)

针对电视屏幕,电影被称为“大荧幕”,也是娱乐行业的顶尖产业。作为一项综合艺术,从被发明至今,近200年的发展史中,无人可以替代,并始终走在时代的前列。 电影回放的原理就是“视觉残留”,也就是快速移过眼前的画面,会在人的大脑中残留短暂的时间,随着画面不断地移过,…

智慧城市,未来已来:数字中国建设中的创新实践

随着数字技术的飞速发展,中国正迎来一个全新的智慧城市时代。在这个时代,城市的每一个角落都充满了科技的气息,人们的生活也因此变得更加便捷、高效和美好。今天,就让我们一起走进这个充满未来感的智慧城市,探索数字中…

onlyoffice api开发

编写代码 按照https://api.onlyoffice.com/editors/basic编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scal…

长短连接对压测的影响有多大

【引言】 当我们进行压力测试时&#xff0c;长短连接是一个非常重要的参数。但是&#xff0c;你知道吗&#xff1f;长短连接对于压测结果有着非常大的影响&#xff01;如果你不理解这个参数&#xff0c;那么你的压测结果可能会出现严重的偏差。 在这篇文章中&#xff0c;我将…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家&#xff0c;我打开自己的项目&#xff0c;执行&#xff1a; cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码&#xff0c;然后更新依赖&#xff0c;最后开始今晚的开发时候&#xff0c;意外发生了&#xff0c;竟然报错了&#xff0c;…

吴恩达deeplearning.ai:Tensorflow训练一个神经网络

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai 在之前的博客中。我们陆续学习了各个方面的有关深度学习的内容&#xff0c;今天可以从头开始训练一个神经网络了。 Tensorflow训练神经网络模型 我们使用之前用过的例子&#xff1a; 这个神经…

软件开发的艺术与科学

随着科技的飞速发展&#xff0c;软件开发已成为当今社会不可或缺的一部分。从智能手机应用程序到企业级管理系统&#xff0c;软件开发已经渗透到我们生活的方方面面。本文将探讨软件开发的重要性和现状&#xff0c;以及开发过程中涉及的关键环节和常见问题。 一、软件开发的重…

leetcode:491.递增子序列

1.误区&#xff1a;不能直接对数组排序再求解子集&#xff0c;因为那样就改变了原有数组的顺序 2.树形结构&#xff1a;一个一个取数&#xff0c;然后保证是递增序列&#xff0c;且不能重复。&#xff08;数层上不可以重复取&#xff0c;树枝上可以重复取&#xff09;收集的结…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高&#xff0c;Kotlin 当一个图片放在ImageView里面后&#xff0c;用以下方式获取图的宽高&#xff1a; val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

SpringBoot实现缓存预热方案

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。 那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢? 实现方案概述 在 Spring Boot 启动之后,可以通过以下手段实现缓存预热: 使用…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木&#xff0c;让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0c;每天向右修剪一棵灌木。当修剪了最右侧的灌木后&#xff0c;她会…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

Java 存图方式

图最常见的两种存储方式是邻接表和邻接矩阵。 链式前向星其实就是静态建立的邻接表,时间效率为 O(n),空间效率也为 O(n)。遍历效率也为 O(n)。 一、邻接表 邻接表存储方式适合存储边稀疏的图,判断两点之间是否有边不方便; 邻接矩阵适合存储边稠密的,判断边和权值都很方…

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

使用Django的admin功能管理数据_vscode

之前的文章 项目 hello_django, app名 hello&#xff0c;已有的model LogMessage&#xff1a; https://blog.csdn.net/weixin_44741835/article/details/136202771?spm1001.2014.3001.5502 参考得到电子书&#xff1a;第八章。 https://www.dedao.cn/ebook/reader?idrEQKv6…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时&#xff0c;使用windows上内置搜索会很慢&#xff0c;这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索&#xff0c;"Everything&…

好用的伪原创工具有哪些?

伪原创工具哪个好用&#xff1f;在互联网时代&#xff0c;内容创作是一项至关重要的工作。然而&#xff0c;随着信息爆炸式增长&#xff0c;内容创作者们往往面临着时间和灵感的压力。为了解决这一难题&#xff0c;越来越多的人开始寻找伪原创工具&#xff0c;这些工具可以帮助…

32单片机基础:对射式红外传感器计次

接线如下图&#xff1a; 在HardWare建立两个文件&#xff1a;如图 COuntSensor.c 如何配置外部中断,根据下面图&#xff0c;我们需要把外部中断从GPIO到NVIC这一路出现的外设模块都配置好。把这条信号打通就OK了。 1.配置RCC:把我们这里涉及的外设时钟都打开&#xff0c;不打…