目录
一 系统架构图
StarRocks是一个分布式离线/实时分析平台,可用于处理PB级别的数据量。它使用了分层存储技术,并提供了SQL接口以便于用户进行数据分析。StarRocks支持对多维度数据进行OLAP操作,并且具有较高的数据处理和查询速度。它适用于数据仓库、BI、实时数据分析等领域。
1 FE
FE 是 StarRocks 的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。每个 FE 节点都会在内存保留一份完整的元数据,这样每个 FE 节点都能够提供无差别的服务。
FE 有三种角色:Leader FE,Follower FE 和 Observer FE。Follower 会通过类 Paxos 的 Berkeley DB Java Edition(BDBJE)协议自动选举出一个 Leader。三者区别如下:
Leader
Leader 从 Follower 中自动选出,进行选主需要集群中有半数以上的 Follower 节点存活。如果 Leader 节点失败,Follower 会发起新一轮选举。
Leader FE 提供元数据读写服务。只有 Leader 节点会对元数据进行写操作,Follower 和 Observer 只有读取权限。Follower 和 Observer 将元数据写入请求路由到 Leader 节点,Leader 更新完数据后,会通过 BDB JE 同步给 Follower 和 Observer。必须有半数以上的 Follower 节点同步成功才算作元数据写入成功。
Follower
只有元数据读取权限,无写入权限。通过回放 Leader 的元数据日志来异步同步数据。
参与 Leader 选举,必须有半数以上的 Follower 节点存活才能进行选主。
Observer
主要用于扩展集群的查询并发能力,可选部署。
不参与选主,不会增加集群的选主压力。
通过回放 Leader 的元数据日志来异步同步数据。
2 BE
BE 是 StarRocks 的后端节点,负责数据存储、SQL执行等工作。
数据存储方面,StarRocks 的 BE 节点都是完全对等的,FE 按照一定策略将数据分配到对应的 BE 节点。BE 负责将导入数据写成对应的格式存储下来,并生成相关索引。
在执行 SQL 计算时,一条 SQL 语句首先会按照具体的语义规划成逻辑执行单元,然后再按照数据的分布情况拆分成具体的物理执行单元。物理执行单元会在对应的数据存储节点上执行,这样可以实现本地计算,避免数据的传输与拷贝,从而能够得到极致的查询性能。
在进行 Stream load 导入时,FE 会选定一个 BE 节点作为 Coordinator BE,负责将数据分发到其他 BE 节点。导入的最终结果由 Coordinator BE 返回给用户。更多信息,参见 Stream load。
3 数据存储
下图展示了 StarRocks 的数据划分以及 Tablet 多副本机制。图中,表按照日期划分为 4 个分区,第一个分区进一步切分成 4 个 Tablet。每个 Tablet 使用 3 副本进行备份,分布在 3 个不同的 BE 节点上。
StarRocks 采用 MPP (Massively Parallel Processing) 分布式执行框架。在 MPP 执行框架中,一条查询请求会被拆分成多个物理计算单元,在多机并行执行。每个执行节点拥有独享的资源(CPU、内存)。
MPP是什么?
MPP(Massively Parallel Processing,大规模并行处理)架构是一种分布式计算架构,主要目标是通过并行处理来加速数据处理和分析的速度。在MPP架构中,数据被分成多个块并分配给多个处理单元来处理,每个处理单元可以是一个独立的计算节点或处理器核心。这种架构可以使用多种技术来实现,如共享磁盘或共享存储。MPP架构通常被用于大型数据仓库和高性能计算环境中,以支持大量数据的快速处理和分析。
全面向量化执行引擎
StarRocks 通过实现全面向量化引擎,充分发挥了 CPU 的处理能力。全面向量化引擎按照列式的方式组织和处理数据。StarRocks 的数据存储、内存中数据的组织方式,以及 SQL 算子的计算方式,都是列式实现的。按列的数据组织也会更加充分的利用 CPU 的 Cache,按列计算会有更少的虚函数调用以及更少的分支判断从而获得更加充分的 CPU 指令流水。
另一方面,StarRocks 的全面向量化引擎通过向量化算法充分的利用 CPU 提供的 SIMD(Single Instruction Multiple Data)指令。这样 StarRocks 可以用更少的指令数目,完成更多的数据操作。经过标准测试集的验证,StarRocks的全面向量化引擎可以将执行算子的性能,整体提升 3~10 倍。
除了使用向量化技术实现所有算子外,StarRocks 还在执行引擎中实现了其他的优化。比如 StarRocks 实现了 Operation on Encoded Data 的技术。对于字符串字段的操作,StarRocks 在无需解码情况下就可以直接基于编码字段完成算子执行,比如实现关联算子、聚合算子、表达式算子计算等。这可以极大的降低 SQL 在执行过程中的计算复杂度。通过这个优化手段,相关查询速度可以提升 2 倍以上。
3 建表语句
以明细表模型为例:
use example_db;
CREATE TABLE IF NOT EXISTS `detailDemo` (
`recruit_date` DATE NOT NULL COMMENT "YYYY-MM-DD",
`region_num` TINYINT COMMENT "range [-128, 127]",
`num_plate` SMALLINT COMMENT "range [-32768, 32767] ",
`tel` INT COMMENT "range [-2147483648, 2147483647]",
`id` BIGINT COMMENT "range [-2^63 + 1 ~ 2^63 - 1]",
`password` LARGEINT COMMENT "range [-2^127 + 1 ~ 2^127 - 1]",
`name` CHAR(20) NOT NULL COMMENT "range char(m),m in (1-255)",
`profile` VARCHAR(500) NOT NULL COMMENT "upper limit value 1048576 bytes",
`hobby` STRING NOT NULL COMMENT "upper limit value 65533 bytes",
`leave_time` DATETIME COMMENT "YYYY-MM-DD HH:MM:SS",
`channel` FLOAT COMMENT "4 bytes",
`income` DOUBLE COMMENT "8 bytes",
`account` DECIMAL(12,4) COMMENT "",
`ispass` BOOLEAN COMMENT "true/false"
) ENGINE=OLAP
DUPLICATE KEY(`recruit_date`, `region_num`)
PARTITION BY RANGE(`recruit_date`)
(
PARTITION p20220311 VALUES [('2022-03-11'), ('2022-03-12')),
PARTITION p20220312 VALUES [('2022-03-12'), ('2022-03-13')),
PARTITION p20220313 VALUES [('2022-03-13'), ('2022-03-14')),
PARTITION p20220314 VALUES [('2022-03-14'), ('2022-03-15')),
PARTITION p20220315 VALUES [('2022-03-15'), ('2022-03-16'))
)
DISTRIBUTED BY HASH(`recruit_date`, `region_num`) BUCKETS 8
PROPERTIES (
"replication_num" = "1"
);
注意
在 StarRocks 中,字段名不区分大小写,表名区分大小写。
建表时,DISTRIBUTED BY 为必填字段。
建表语句说明
排序键
StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key)。明细模型中由 DUPLICATE KEY 指定排序列。以上示例中的 recruit_date 以及 region_num 两列为排序列。
注意:排序列在建表时应定义在其他列之前。排序键详细描述以及不同数据模型的表的设置方法请参考 排序键。
字段类型
StarRocks 表中支持多种字段类型,除以上示例中已经列举的字段类型,还支持 BITMAP 类型,HLL 类型,ARRAY 类型
注意
:在建表时,您应尽量使用精确的类型。例如,整形数据不应使用字符串类型,INT 类型即可满足的数据不应使用 BIGINT 类型。精确的数据类型能够更好的发挥数据库的性能。
分区分桶
PARTITION 关键字用于给表 创建分区。以上示例中使用 recruit_date 进行范围分区,从 11 日到 15 日每天创建一个分区。StarRocks 支持动态生成分区,详见 动态分区管理。为了优化生产环境的查询性能,我们强烈建议您为表制定合理的数据分区计划。
DISTRIBUTED 关键字用于给表 创建分桶,以上示例中使用 recruit_date 以及 region_num 两个字段通过 Hash 算法创建 8 个桶。
创建表时合理的分区和分桶设计可以优化表的查询性能。有关分区分桶列如何选择,详见 数据分布。
查看修改表结构作业状态
修改表结构为异步操作。提交成功后,您可以通过以下命令查看作业状态。
SHOW ALTER TABLE COLUMN\G;
当作业状态为 FINISHED,则表示作业完成,新的表结构修改已生效。
修改 Schema 完成之后,您可以通过以下命令查看最新的表结构。
DESC table_name;
示例如下:
MySQL [example_db]> desc detailDemo;
+--------------+-----------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------+------+-------+---------+-------+
| recruit_date | DATE | No | true | NULL | |
| region_num | TINYINT | Yes | true | NULL | |
| num_plate | SMALLINT | Yes | false | NULL | |
| tel | INT | Yes | false | NULL | |
| id | BIGINT | Yes | false | NULL | |
| password | LARGEINT | Yes | false | NULL | |
| name | CHAR(20) | No | false | NULL | |
| profile | VARCHAR(500) | No | false | NULL | |
| hobby | VARCHAR(65533) | No | false | NULL | |
| leave_time | DATETIME | Yes | false | NULL | |
| channel | FLOAT | Yes | false | NULL | |
| income | DOUBLE | Yes | false | NULL | |
| account | DECIMAL64(12,4) | Yes | false | NULL | |
| ispass | BOOLEAN | Yes | false | NULL | |
| uv | BIGINT | Yes | false | 0 | |
+--------------+-----------------+------+-------+---------+-------+
15 rows in set (0.00 sec)
取消修改表结构
您可以通过以下命令取消当前正在执行的作业。
CANCEL ALTER TABLE COLUMN FROM table_name\G;
4 导入数据
为适配不同的数据导入需求,StarRocks 系统提供了五种不同的导入方式,以支持不同的数据源或者导入方式。
Broker Load
Broker Load
Broker Load 模式是一种异步数据导入模式,通过 Broker 进程访问并读取外部数据源,然后采用 MySQL 协议向 StarRocks 创建导入作业。
Broker Load 模式适用于源数据在 Broker 进程可访问的存储系统(如 HDFS,S3)中的情景,可以支撑数据量达数百 GB 的导入作业。该导入方式支持的数据源有 Apache Hive™ 等。
Spark Load
Spark Load
Spark Load 是一种异步数据导入模式,通过外部的 Apache Spark™ 资源实现对导入数据的预处理,提高 StarRocks 大数据量的导入性能并且节省 StarRocks 集群的计算资源。
Spark Load 模式适用于初次向 StarRocks 迁移大数据量(TB 级别)的场景。该导入方式支持的数据源应位于 Apache Spark™ 可访问的存储系统(如 HDFS)中。
通过 Spark Load 可以基于 Apache Hive™ 表实现 全局字典 的数据结构,对输入数据进行类型转换,保存原始值到编码值的映射,例如将字符串类型映射成整型。
Stream Load
Stream Load
Stream Load 是一种同步数据导入模式。用户通过 HTTP 协议发送请求将本地文件或数据流导入到 StarRocks 中,并等待系统返回导入的结果状态,从而判断导入是否成功。
Stream Load 模式适用于导入本地文件,或通过程序导入数据流中的数据。该导入方式支持的数据源有 Apache Flink®、CSV 文件等。
Routine Load
Routine Load(例行导入)提供从指定数据源进行自动数据导入的功能。您可以通过 MySQL 协议提交例行导入作业,生成一个常驻线程,不间断地从数据源(如 Apache Kafka®)中读取数据并导入到 StarRocks 中。
Insert Into
Insert Into
Insert Into 导入模式是一种同步数据导入模式,类似 MySQL 中的 Insert 语句,StarRocks 支持通过 INSERT INTO tbl SELECT …; 的方式从 StarRocks 的表中读取数据并导入到另一张表。您也可以通过 INSERT INTO tbl VALUES(…); 插入单条数据。该导入方式支持的数据源有 DataX/DTS、Kettle/Informatic、以及 StarRocks 本身。
具体导入方式详情请参考 数据导入。
通过 Stream Load 导入数据
以下示例以 Stream Load 导入方式为例,将文件中的数据导入到 建表 章节中创建的 detailDemo 表中。
在本地创建数据文件 detailDemo_data,以逗号作为数据之间的分隔符,插入两条数据。具体内容如下:
2022-03-13,1,1212,1231231231,123412341234,123452342342343324,hello,welcome,starrocks,2022-03-15 12:21:32,123.04,21.12345,123456.123456,true
2022-03-14,2,1212,1231231231,123412341234,123452342342343324,hello,welcome,starrocks,2022-03-15 12:21:32,123.04,21.12345,123456.123456,false
接着,以
"streamDemo"
为 Label,通过 curl 命令封装 HTTP 请求,将本地文件 detailDemo_data 导入 detailDemo 表。
curl --location-trusted -u root: -T detailDemo_data -H "label: streamDemo" \
-H "column_separator:," \
http://127.0.0.1:8030/api/example_db/detailDemo/_stream_load
注意:以上示例中,root 为连接 FE 节点的用户名,默认密码为空,若使用的用户有密码,需在冒号后面补充密码;HTTP 地址中 IP 为 FE 节点 IP,端口为 fe.conf 中配置的 http port。