StarRocks入门之路

0、starrocks介绍

StarRocks是一个高性能分布式关系型列式数据库,通过MPP执行框架,单节点每秒可处理多达100亿行数据,同时支持星型模型和雪花模型。

StarRocks集群由FE和BE构成,可以使用MySQL客户端访问StarRocks集群。

FE接收MySQL客户端的连接,解析并执行SQL语句,管理元数据,执行SQL DDL命令, 用Catalog记录库、表、分区,tablet副本等信息。

BE管理tablet副本,tablet是table经过分区分桶形成的子表,采用列式存储。BE受FE指导,创建或删除子表。

BE接收FE分发的物理执行计划并指定BE coordinator节点,在BE coordinator的调度下,与其他BE worker共同协作完成执行。

BE读本地的列存储引擎,获取数据,通过索引和谓词下沉快速过滤数据。

1、为什么要使用starrocks

首先,我不准备去说什么是mpp数据库是什么,starrocks有多好,原因是官网上介绍的足够详细了,所以我准备说说starrocks相对于其他好在哪里以及类似数据库clickhouse。

先说说与clickhouse的对比吧:

  1. 数据库的扩缩容:难点不在于数据库集群增加节点,而在于增加节点后数据能否均衡。倘若数据不均衡,就会导致数据热点,在数据较多的机器上参与计算的数据多,单一节点的计算瓶颈会导致整体任务执行时间拉长。clickhouse的数据均衡并不是很方便,需要手动维护,而starrocks的数据均衡是自动完成的,降低了用户上手难度。

  2. 集群高可用高可靠:clickhouse使用副本分片,需要将同一分片副本在不同节点上以此来保证数据的高可靠性。其次保证高可用,需要使用zookeeper进行通信,增加了运维成本。starrocks集群不需要依赖任何其他组件。

再说说对比hadoop生态类的组件:

  1. hadoop生态的存储依赖于hdfs,比如传统数据仓库采用hive+hdfs方式,而starrocks存算一体,使用非常方便。

  2. hdfs默认存储方式没有压缩,需要安装额外插件,比如lzo、snappy等,starrocks默认采用lz4,减少用户额外工作量。

  3. 计算速度方面,hive计算速度是非常慢的,实时性计算需要采用spark、kylin等,那么为了满足这样计算需要临时开发或提前构建cube,总之体验不太好,而starrocks不需要构建cube,担心维度爆炸,剪枝,也不用打开编辑器撸一段代码。starrocks的计算速度可以满足业务上的灵活查询,在维度建模、雪花模型上的体验也是可以的。

  4. starrocks的查询速度、支持高并发查询也是可以媲美传统大数据解决方案。

以上是我在从hadoop生态到starrocks数据库的使用心得。

2、starrocks使用必备

  1. starrocks兼容mysql协议,数据访问使用方式上可以像使用mysql一样使用starrocks。

  2. mysql、starrocks等兼容mysql协议的数据库都可以使用datax来进行数据的迁移。

  3. 联邦查询:hive支持联邦查询,比如可以hive on hbase,hive on elasticsearch,只不过需要添加依赖包(hbase不需要)。通过联邦查询,一份数据不需要多地存储,保证了数据源的一致性。目前最新版本支持hive、mysql、elasticsearch三种类型的外表。

  4. 数据导入:

    • Routine Load:starrocks可以实时消费kafka数据。

    • Datax writer:可以将业务数据批量导入。

    • 除了常用的实时导入和批量导入,还支持spark、flink数据导入,增强和其他组件交互能力,让生态更完善。

  5. 模型:

    • 明细模型:用户导入什么数据就存储什么数据,一般用于存储历史数据,比如日志数据。

    • 聚合模型:聚合模型有主键概念,会将用户导入的数据进行合并,可以立即为后台自动完成基于明细数据的group by操作。

    • 更新模型:更新模型中,主键数据是唯一的,用户不同时间导入的数据,更新模型会帮用户完成数据覆盖更新,保留时间最近的数据。

  6. 分区与分桶:

    • 一般使用分区,都是动态分区,动态分区要开启,参数: dynamic_partition.enable" = "true"

    • 数据开发时,一般数据都是按天分区,按天写入数据,按天创建分区,也不会删除之前的分区,所以动态分区表的参数配置如下:

      #按天分区
       "dynamic_partition.time_unit" = "DAY",
       #提前创建一天分区
       "dynamic_partition.end" = "1",
       #分区名浅醉,可以自定义
       "dynamic_partition.prefix" = "p",

    • 创建表时需要指定存储介质,一般是SSD和HDD,集群配置中也会指定,当建表时没有指定,会使用集群中的配置,优先使用建表语句中。设置冷却时间的参数 storage_cooldown_time,如果不需要冷却,可以将该值设置为"9999-12-31 00:00:00",默认设置是30天,30天是指创建表时间加30天,所以手动指定时,尽量将时间设置在夜间触发,因为冷热数据迁移会占用cpu等资源。

    • 分桶:starrocks是先分区后分桶,如果不设置分区,会默认给一个分区,所有的桶都在这个分区里,分桶计算规则是hash分桶,比如DISTRIBUTED BY HASH(site_id) BUCKETS 10,数据进入分区后,根据将每个分区下的数据分了10个桶,再根据hash算法,数据分别进入这10个桶中。

      官方——分桶数如何确定

      在StarRocks系统中,分桶是实际物理文件组织的单元。数据在写入磁盘后,就会涉及磁盘文件的管理。一般而言,我们不建议分桶数据过大或过小,尽量适中会比较妥当。

      分桶的数据的压缩方式使用的是Lz4。建议压缩后磁盘上每个分桶数据文件大小在 100MB-1GB 左右。这种模式在多数情况下足以满足业务需求。

      建议用户根据集群规模的变化,建表时调整分桶的数量。集群规模变化,主要指节点数目的变化。假设现有20G原始数据,依照上述标准,可以建10个分桶(压缩前每个 tablet 大小2GB,压缩后可能在 200MB-500MB)。但是如果用户有20台机器,那么可以适当再缩小每个分桶的数据量,加大分桶数。比如分成40个分桶,大概每个 tablet 500MB(保持压缩后一般不小于 100MB)。

      对于这个计算方式,是一个通用的方案,但在实际中要根据数据量、数据长度、服务器配置等因素综合考虑,核心因素还是在于数据均衡以免引起数据倾斜,数据文件不过大以免降低计算效率,数据文件不过多以免增加元数据维护成本。

3、实战

  1. 查询:对sql语句分析主要是查询规划和查询执行,查询规划是在sql客户端explain +sql,就可以得到查询规划。查询执行,需要手动开启,开启后,进入对应host的页面可以找到刚才执行的profile,进行分析就可以。

     #session级别,在某个客户端生效
     set is_report_success = true

    官网给了一个例子如何分析explain。

    https://docs.starrocks.com/zh-cn/main/administration/Query_planning

  2. sql优化:先进行分区裁剪,减少数据量。条件匹配时按照前缀索引的顺序。

  3. 添加分区:需要先关闭动态分区,手动按照分区创建规则,添加分区之后再开启动态分区(别忘记),分区默认是左闭右开。

     1、查看分区名称
     show create table,会显示所有分区名称及分区区间
     分区表建表时默认根据日期分区,会有默认分区名称前缀p
     2、添加分区命令
     alter table test add partition p20220508 VALUES [('2022-05-08'), ('2022-05-09')) 
     这时会提示需要先修改 关闭动态分区参数
     3、关闭动态分区
     ALTER TABLE test SET ("dynamic_partition.enable" = "false")
     4、再次执行第二步添加分区命令
     5、开启动态分区
     ALTER TABLE test SET ("dynamic_partition.enable" = "true")

  4. starrocks的主键覆盖是立即生效?还是后台慢慢合并数据?

     StarRocks的后台合并就是参考google的mesa的模型,有两层compaction,会后台策略触发合并。如果没有合并完成,查询的时候会合并,但是读出来只会有一个最新的版本,不存在「导入后数据读不到最新版本」的情况。

  5. 外部表不能修改表结构

  6. olap表不能修改表名

  7. 如果不确定字段类型,尤其是double、decimal和int之前转换时,可以先将数据类型设置为string,string类型可以转其他类型。

  8. sum(ifnull(col,0)) 优化后的写法:ifnull(sum(col),0)。比如有10000条数据,第一种写法需要计算20000次,第二种写入计算10001次。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗少说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值