数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计

这篇具有很好参考价值的文章主要介绍了数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文是学习StarRocks的读书笔记,让你快速理解下一代高性能分析数据仓库的架构、数据存储及表设计。

1. 架构

1.1. 整体架构

StarRocks的架构相对简单。

  • 整个系统只包含两种类型的组件,前端(FE)和后端(BE),StarRocks不依赖任何外部组件,简化了部署和维护。
  • FE和BE可以在不停机的情况下横向扩展。
  • StarRocks具有元数据和服务数据的复制机制,这增加了数据的可靠性,并有效地防止单点故障(SPOFs)。
  • 与MySQL协议兼容,并支持标准SQL。用户可以轻松地从MySQL客户端连接到StarRocks
    数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计,MPPDB,数仓,数据仓库,StarRocks,MPPDB,数据库

1.2. 数据管理

数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计,MPPDB,数仓,数据仓库,StarRocks,MPPDB,数据库

2. 表设计

2.1. 列存储

数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计,MPPDB,数仓,数据仓库,StarRocks,MPPDB,数据库

2.2.索引

数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计,MPPDB,数仓,数据仓库,StarRocks,MPPDB,数据库

2.3. 加速策略

  • Pre-aggregation
  • Partitioning and bucketing
  • Materialized view: 物化视图的数据以与表数据相同的方式组织和存储。但是物化视图可以有自己的前缀索引。在为物化视图创建前缀索引时,可以指定适当的聚合粒度、列计数和维列顺序,以确保经常使用的查询条件能够命中物化视图前缀索引表中的预期条目。
  • Per-column index
    • A Bloom filter : Bloom过滤器用于确定数据块是否包含要查询的值。
    • A zone map: 区域映射用于定位指定范围内的值。
    • A bitmap index: 位图索引用于查找ENUM数据类型列中满足指定查询条件的行。

3. Data models

StarRocks提供四种数据模型: Duplicate Key, Aggregate Key, Unique Key, and Primary Key

3.1. Duplicate Key model

适用场景

  • 分析原始数据,如原始日志和原始操作记录。
  • 可以使用多种方法查询数据,不受预聚合方法的限制。
  • 加载日志数据或时序数据。新数据以追加模式写入,现有数据不更新。

注意

  • 默认情况下,如果没有指定排序键列,StarRocks将使用前三列作为排序键【sort key】列
  • 可以在表创建时创建索引,如BITMAP索引和Bloomfilter索引。
  • 如果加载了两条相同的记录,将它们保留为两条记录,而不是一条
  • 只能向表中追加数据。不能修改表中的现有数据。
CREATE TABLE IF NOT EXISTS detail (
    event_time DATETIME NOT NULL COMMENT "datetime of event",
    event_type INT NOT NULL COMMENT "type of event",
    user_id INT COMMENT "id of user",
    device_code INT COMMENT "device code",
    channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 8;

3.2. Aggregate Key model

此模型有助于减少查询需要处理的数据量,从而加快查询速度。

适用场景:数据统计和分析场景

使用时有如下特点:

  • 大多数查询是聚合查询,例如SUM、COUNT和MAX。
  • 不需要检索原始的详细数据。
  • 历史数据不经常更新。只追加新数据。

聚合时机

  • ingestion 阶段: 当数据批量加载到表中时,每个批量包含一个数据版本。生成数据版本后,StarRocks将在数据版本中具有相同排序键的数据进行聚合。
  • compaction 阶段:将数据摄取时生成的多个数据版本的文件定期压缩成一个大文件时,StarRocks会在大文件中聚合具有相同排序键的数据。
  • query 阶段:在返回查询结果之前聚合所有数据版本中具有相同排序键的数据。

注意

  • 如果AGGREGATE KEY关键字不包括所有维度列,则无法创建表。
  • 如果没有使用AGGREGATE key关键字显式地定义排序键列,将选择除度量列之外的所有列作为排序键列
  • 在运行查询时,排序键列在多个数据版本聚合之前被过滤,而度量列在多个数据版本聚合之后被过滤。
  • 创建表时,不能在表的度量列上创建BITMAP索引或Bloom Filter索引
  • 将数据加载到使用聚合键模型的表中时,只能更新表的所有列
CREATE TABLE IF NOT EXISTS example_db.aggregate_tbl (
    site_id LARGEINT NOT NULL COMMENT "id of site",
    date DATE NOT NULL COMMENT "time of event",
    city_code VARCHAR(20) COMMENT "city_code of user",
    pv BIGINT SUM DEFAULT "0" COMMENT "total page views"
)
AGGREGATE KEY(site_id, date, city_code)
DISTRIBUTED BY HASH(site_id) BUCKETS 8
PROPERTIES ("replication_num" = "1");

3.3. Unique Key

适用场景:

  • 需要频繁实时更新数据的业务场景,如在电子商务场景中,每天可以下数亿个订单,订单状态经常变化

注意:

  • 主键必须创建在执行唯一约束且不能更改名称的列上
    • 在运行查询时,主键列在多个数据版本聚合之前被过滤,而度量列在多个数据版本聚合之后被过滤
    • 在聚合过程中,StarRocks比较所有主键列。这很耗时,而且可能会降低查询性能。因此,不要定义大量的主键列
  • 创建表时,不能在表的指标列上创建BITMAP索引或Bloom Filter索引。
  • 不支持实体化视图
  • 将数据加载到使用唯一键模型的表中时,只能更新表的所有列
CREATE TABLE IF NOT EXISTS orders (
    create_time DATE NOT NULL COMMENT "create time of an order",
    order_id BIGINT NOT NULL COMMENT "id of an order",
    order_state INT COMMENT "state of an order",
    total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 8;

3.4. Primary Key

基于StarRocks提供的一个新的存储引擎设计的
与Unique Key模型不同,Primary Key模型在查询期间不需要聚合操作,并支持谓词和索引的下推。因此,Primary Key模型可以提供较高的查询性能,尽管实时和频繁的数据更新。

Duplicate Key模型采用MoR策略。MoR简化了数据写入,但需要在线聚合多个数据版本。此外,Merge操作符不支持下推谓词和索引。结果,查询性能下降。
Primary Key模型采用删除+插入策略,确保每条记录都有唯一的主键。这样,主键模型就不需要合并操作。详情如下:

  • 对记录进行更新操作时,它通过搜索主键索引来定位该记录,将该记录标记为已删除,并插入一条新记录。换句话说,StarRocks将更新操作转换为删除操作加上插入操作。
  • 对记录进行删除操作时,它通过搜索主键索引来定位记录,并将记录标记为已删除

适用场景

  • 数据需要经常实时更新
    • 实时流数据从交易处理系统到StarRocks,这简化了数据同步,并提供比使用唯一键模型的MoR (Merge on Read)表高3到10倍的查询性能
    • 通过对单个列执行更新操作来连接多个流:这些场景中的上游数据可能来自各种应用程序,如购物app、物流app和银行app,或者来自机器学习系统。主键模型非常适合这些场景,因为它支持对单个列的更新。每个应用程序或系统只能更新在自己的服务范围内保存数据的列
  • 主键占用的内存【memory occupied by the primary key 】是可控的
    • 当将数据加载到表中时,StarRocks将主键索引加载到内存中。因此Primary Key模型需要比其他三个数据模型更大的内存容量。StarRocks将组成主键的字段的总长度限制为编码后的127字节

    • 表包含快速变化的数据和缓慢变化的数据。快速变化的数据经常在最近几天更新,而缓慢变化的数据很少更新,如订单表,按天分区,在运行数据加载作业时,主键索引不会加载到内存中,只有最近更新的订单的索引项才会加载到内存中。

    • 表是一个由数百或数千列组成的平面表。主键只包含表数据的一小部分,并且只消耗少量内存。如user status or profile table,表的列太多,但只有几千万到几亿条

注意

  • 必须在强制执行唯一约束的列上创建主键,并且不能更改主键列的名称。
  • 主键列可以是以下任何数据类型:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、STRING、VARCHAR、DATE和DATETIME。但是,主键列不能定义为NULL。
  • 分区列和桶列必须参与主键。
  • the memory occupied by the primary key index 的计算公式: (主键长度+9) x 记录数量 x 副本数 x 1.5 = 占用内存大小
    • 9是每行不可变的开销,1.5是每个哈希表的平均额外开销
  • enable_persistent_index:主键索引可以持久化到磁盘并存储在内存中,以避免占用太多内存。
  • 从2.3.0版本开始, indicator column现在支持BITMAP、HLL数据类型。
  • 创建表时,不能在表的 metric columns 上创建BITMAP索引或Bloom Filter索引。
  • 从2.4.0版本开始,可以基于主键表创建异步物化视图
create table orders (
    dt date NOT NULL,
    order_id bigint NOT NULL,
    user_id int NOT NULL,
    merchant_id int NOT NULL,
    good_id int NOT NULL,
    good_name string NOT NULL,
    price int NOT NULL,
    cnt int NOT NULL,
    revenue int NOT NULL,
    state tinyint NOT NULL
) PRIMARY KEY (dt, order_id)
PARTITION BY RANGE(`dt`) (
    PARTITION p20210820 VALUES [('2021-08-20'), ('2021-08-21')),
    PARTITION p20210821 VALUES [('2021-08-21'), ('2021-08-22')),
    ...
    PARTITION p20210929 VALUES [('2021-09-29'), ('2021-09-30')),
    PARTITION p20210930 VALUES [('2021-09-30'), ('2021-10-01'))
) DISTRIBUTED BY HASH(order_id) BUCKETS 4
PROPERTIES("replication_num" = "3",
"enable_persistent_index" = "true");

create table users (
    user_id bigint NOT NULL,
    name string NOT NULL,
    email string NULL,
    address string NULL,
    age tinyint NULL,
    sex tinyint NULL,
    last_active datetime,
    property0 tinyint NOT NULL,
    property1 tinyint NOT NULL,
    property2 tinyint NOT NULL,
    property3 tinyint NOT NULL,
    ....
) PRIMARY KEY (user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 4
PROPERTIES("replication_num" = "3",
"enable_persistent_index" = "true");

4. 数据分布 Data distribution

4.1. 基本概念

  • 分区
    • 在分区时,可以设置分区的存储策略,包括副本数量、热数据或冷数据的存储策略、存储介质等。
    • StarRocks允许在集群中使用多个存储介质。例如,将最新数据保存在SSD硬盘上,可以提高查询性能;将历史数据保存在SATA硬盘上,可以降低存储成本。
  • 分桶
    • 分桶是将一个分区划分为多个更易于管理的部分即tablet,tablet是使用和分配的最小存储单元
    • bucket列中具有相同哈希值的数据被分布到同一tablet中
    • StarRocks为每个tablet创建多个副本(默认为三个),以防止数据丢失。这些副本由单独的本地存储引擎管理。创建表时必须指定bucket列。

4.2. 分区方法

  • Round-robin: distributes data across different nodes in a cyclic.
  • Range: distributes data across different nodes based on the value range of partitioning columns.
  • List: distributes data across different nodes based on the discrete values of partitioning columns, such as age.
  • Hash: distributes data across different nodes based on a hash algorithm.
    为了实现更灵活的数据分布,可以根据业务需求组合以上四种分区方法,例如hash-hash, range-hash, and hash-list。StarRocks提供了以下两种分区方法:
# 整个表只有一个分区,并按site_id分桶
CREATE TABLE site_access(
    site_id INT DEFAULT '10',
    city_code SMALLINT,
    user_name VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id) BUCKETS 10;

# 先按日期分区,再按site_id分桶
CREATE TABLE site_access(
    event_day DATE,
    site_id INT DEFAULT '10',
    city_code VARCHAR(100),
    user_name VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)
(
    PARTITION p1 VALUES LESS THAN ("2020-01-31"),
    PARTITION p2 VALUES LESS THAN ("2020-02-29"),
    PARTITION p3 VALUES LESS THAN ("2020-03-31")
)
DISTRIBUTED BY HASH(site_id) BUCKETS 10;

4.3. 分区、分桶列的选择

  • 分区列的选择
    • 只有DATE、DATETIME或INT类型的列可以用作分区列,
    • 分区列要求:低基数、在查询中经常用作筛选器的列、每个分区的数据量必须小于100GB
  • 分桶列的选择
    • 分桶列的要求:高基数列如ID、在查询中经常用作筛选器的列,列值不能更新
    • 分桶列最多为三个,不能太多
    • 分桶列在指定后不能被修改。
    • tablet反映了StarRocks中数据文件的组织方式。从StarRocks 2.5开始,创建表时不需要设置桶数,StarRocks会自动设置桶数。
    • 建议每个tablet包含大约10GB的原始数据
    • 要在tablet上启用并行扫描,请确保启用了GLOBAL enable_tablet_internal_parallel
CREATE TABLE site_access(
    event_day DATE,
    site_id INT DEFAULT '10',
    city_code VARCHAR(100),
    user_name VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)
(
    PARTITION p1 VALUES LESS THAN ("2020-01-31"),
    PARTITION p2 VALUES LESS THAN ("2020-02-29"),
    PARTITION p3 VALUES LESS THAN ("2020-03-31")
)
DISTRIBUTED BY HASH(site_id) BUCKETS 10;

CREATE TABLE site_access(
    site_id INT DEFAULT '10',
    city_code SMALLINT,
    user_name VARCHAR(
32
) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id,city_code); --do not need to set the number of buckets

管理分区

  • 建表时指定分区
    CREATE TABLE site_access(
        datekey DATE,
        site_id INT,
        city_code SMALLINT,
        user_name VARCHAR(32),
        pv BIGINT DEFAULT '0'
    )
    ENGINE=olap
    DUPLICATE KEY(datekey, site_id, city_code, user_name)
    PARTITION BY RANGE (datekey) 
    (
        START ("2019-01-01") END ("2021-01-01") EVERY (INTERVAL 1 YEAR),
        START ("2021-01-01") END ("2021-05-01") EVERY (INTERVAL 1 MONTH),
        START ("2021-05-01") END ("2021-05-04") EVERY (INTERVAL 1 DAY)
    )
    DISTRIBUTED BY HASH(site_id) BUCKETS 10
    PROPERTIES(
        "replication_num" = "1"
    );
    
  • 修改、删除、恢复、查看分区
    ALTER TABLE site_access
    ADD PARTITION p4 VALUES LESS THAN ("2020-04-30")
    DISTRIBUTED BY HASH(site_id) BUCKETS 20;
    
    ALTER TABLE site_access DROP PARTITION p1;
    
    RECOVER PARTITION p1 FROM site_access;
    
    SHOW PARTITIONS FROM site_access;
    

5. 数据压缩

StarRocks支持四种数据压缩算法:LZ4、Zstandard(或zstd)、zlib和Snappy。
这些数据压缩算法在压缩比和压缩/解压缩性能上存在差异。

压缩比:zlib > Zstandard > LZ4 > Snappy.
特别是LZ4和Zstandard具有良好的压缩比和解压性能

如果对更小的存储空间没有特定的要求,建议使用LZ4或Zstandard。

只能在创建表时为表指定数据压缩算法,不能在创建后更改。文章来源地址https://www.toymoban.com/news/detail-604444.html

CREATE TABLE `data_compression` (
  `id`      INT(11)     NOT NULL     COMMENT "",
  `name`    CHAR(200)   NULL         COMMENT ""
)
ENGINE=OLAP 
UNIQUE KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`) BUCKETS 7
PROPERTIES (
"compression" = "ZSTD"
);

到了这里,关于数据仓库系列:StarRocks 下一代高性能分析数据仓库的架构、数据存储及表设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI大模型时代网络安全攻防对抗升级,瑞数信息变革“下一代应用与数据安全”

      AI与大模型技术加速普及,安全领域也在以创新视角聚焦下一代应用安全WAAP变革,拓展新一代数据安全领域。近日瑞数信息重磅发布了瑞数全新API扫描器、API安全审计、数据安全检测与应急响应系统及分布式数据库备份系统四大新品。此次发布在延续瑞数信息Bot自动化攻击

    2024年02月06日
    浏览(63)
  • 神经数据库:用于使用 ChatGPT 构建专用 AI 代理的下一代上下文检索系统 — (第 2/3 部分)

    书接上回理解构建LLM驱动的聊天机器人时的向量数据库检索的局限性 - (第1/3部分)_阿尔法旺旺的博客-CSDN博客 其中我们强调了( 1 )嵌入生成,然后( 2 )使用近似近邻( ANN )搜索进行矢量搜索的解耦架构的缺点。我们讨论了生成式 AI 模型生成的向量嵌入之间的余弦相似

    2024年02月15日
    浏览(46)
  • 下一代边缘计算技术在哪里?

    扫描文末二维码,立刻 免费 报名 云网一体, 超大规模流量下 边缘云 的架构与技术揭秘 伴随超高清视频时代的开启,热点赛事、晚会直播等特殊场景的巨大流量对业务的带宽储备、节点资源、流量调度和安全保障能力提出了新的挑战。 火山引擎边缘云基于抖音世界杯、央

    2024年02月15日
    浏览(61)
  • 下一代智能合约开发语言(一)

    背景 过去的三个月可能是我过去几年离一百万最近的一次,错过了aptos的空投,几分钟就可以做一个任务,最后空投了150APT代币,最高时价值4W。。。真的是真金白银的教训。不过作为一个开发者,看到的更多是区块链未来的价值,所以开始真正投入到智能合约开发的学习中

    2024年02月02日
    浏览(80)
  • Android 下一代架构指南:DDD

    移动端架构与网站架构的区别是什么?网易新闻客户端的架构演进历程是怎样的?为什么要选择 DDD 思想来指导重构?DDD 落地中应当关注哪些方面?带着这些问题我们来看下文。(节选自网易新闻App架构重构实践) 当前,大多数移动开发团队选择以 MVP 作为业务层的核心架构

    2023年04月10日
    浏览(61)
  • Deno 下一代JavaScript运行时

    目录 1、简介 2、Deno 的特点 3、Deno 和 Node 的区别 4、TypeScript开箱即用 5、内置的基本开发工具 独立可执行文件 测试运行器 代码格式化程序 代码linter  6、专为云而建 7、从浏览器到后端的一致代码 TC39 WinterCG 8、高性能联网 9、数百万个社区模块 10、相关框架 Deno是为执行Jav

    2024年02月08日
    浏览(70)
  • 边缘计算:下一代计算模式的突破

      随着物联网、人工智能和大数据等技术的不断发展,计算需求变得越来越复杂,传统的云计算模式已经难以满足快速增长的数据处理需求。在这样的背景下,边缘计算作为一种全新的计算模式崭露头角,为我们带来了更加灵活、高效的解决方案。本文将深入探讨边缘计算的

    2024年02月12日
    浏览(68)
  • 下一代网络爬虫:AI agents

    下一代网络爬虫是爬虫级 AI agents。 由于现代网页的复杂性,现代爬虫都倾向于使用高性能分布式 RPA,完全和真人一样访问网页,采集数据。由于 AI 的成熟,RPA 工具也在升级为 AI agents。因此,网页爬虫的发展趋势是爬虫级智能体(AI agents),或者我喜欢称为 数字超人 。 互联

    2024年01月22日
    浏览(64)
  • 下一代Windows命名为Win 11?微软的下一步要来了

    这包括一个新的开始菜单,新的系统图标,文件资源管理器的改进,以及结束Windows 95时代的图标,圆角和对内置Windows应用程序的更新也在计划之中。 除了用户界面之外,Windows的重大变化似乎也在稳步进行中。微软似乎准备解决很多挥之不去的问题,计划对多个显示器上的应

    2024年04月12日
    浏览(52)
  • 下一代存储解决方案:湖仓一体

    文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构,它可以同时满足大数据存储和传统数据仓库的需求。具体来说,湖仓一体可以实现以下几个方面的功能: 数据集成: 湖仓一体可以集成多个数据源,包括结构化和非结构化数据,例如传统关系型数据库、

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包