一系统架构
StarRocks是一个分布式离线/实时分析平台,可用于处理PB级别的数据量。它使用了分层存储技术,并提供了SQL接口以便于用户进行数据分析。StarRocks支持对多维度数据进行OLAP操作,并且具有较高的数据处理和查询速度。它适用于数据仓库、BI、实时数据分析等领域。
FE是StarRocks的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。每个FE节点都会在内存保留一份完整的元数据,这样每个FE节点都能够提供无差别的服务。FE有三种角色:LeaderFE,FollowerFE和ObserverFE。Follower会通过类Paxos的BerkeleyDBJavaEdition协议自动选举出一个Leader。三者区别如下:
Leader从Follower中自动选出,进行选主需要集群中有半数以上的Follower节点存活。如果Leader节点失败,Follower会发起新一轮选举。LeaderFE提供元数据读写服务。只有Leader节点会对元数据进行写操作,Follower和Observer只有读取权限。Follower和Observer将元数据写入请求路由到Leader节点,Leader更新完数据后,会通过BDBJE同步给Follower和Observer。必须有半数以上的Follower节点同步成功才算作元数据写入成功。
只有元数据读取权限,无写入权限。通过回放Leader的元数据日志来异步同步数据。参与Leader选举,必须有半数以上的Follower节点存活才能进行选主。
主要用于扩展集群的查询并发能力,可选部署。不参与选主,不会增加集群的选主压力。通过回放Leader的元数据日志来异步同步数据。
3数据存储
下展示了StarRocks的数据划分以及Tablet多副本机制。中,表按照日期划分为4个分区,第一个分区进一步切分成4个Tablet。每个Tablet使用3副本进行备份,分布在3个不同的BE节点上。StarRocks采用MPP分布式执行框架。在MPP执行框架中,一条查询请求会被拆分成多个物理计算单元,在多机并行执行。每个执行节点拥有独享的资源。MPP是什么?
MPP架构是一种分布式计算架构,主要目标是通过并行处理来加速数据处理和分析的速度。在MPP架构中,数据被分成多个块并分配给多个处理单元来处理,每个处理单元可以是一个独立的计算节点或处理器核心。这种架构可以使用多种技术来实现,如共享磁盘或共享存储。MPP架构通常被用于大型数据仓库和高性能计算环境中,以支持大量数据的快速处理和分析。全面向量化执行引擎
StarRocks通过实现全面向量化引擎,充分发挥了CPU的处理能力。全面向量化引擎按照列式的方式组织和处理数据。StarRocks的数据存储、内存中数据的组织方式,以及SQL算子的计算方式,都是列式实现的。按列的数据组织也会更加充分的利用CPU的Cache,按列计算会有更少的虚函数调用以及更少的分支判断从而获得更加充分的CPU指令流水。另一方面,StarRocks的全面向量化引擎通过向量化算法充分的利用CPU提供的SIMD指令。这样StarRocks可以用更少的指令数目,完成更多的数据操作。经过标准测试集的验证,StarRocks的全面向量化引擎可以将执行算子的性能,整体提升3~10倍。除了使用向量化技术实现所有算子外,StarRocks还在执行引擎中实现了其他的优化。比如StarRocks实现了OperationonEncodedData的技术。对于字符串字段的操作,StarRocks在无需解码情况下就可以直接基于编码字段完成算子执行,比如实现关联算子、聚合算子、表达式算子计算等。这可以极大的降低SQL在执行过程中的计算复杂度。通过这个优化手段,相关查询速度可以提升2倍以上。
3建表语句
以明细表模型为例:useexample_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"
);
查看修改表结构作业状态修改表结构为异步操作。提交成功后,您可以通过以下命令查看作业状态。SHOWALTERTABLECOLUMNG;当作业状态为FINISHED,则表示作业完成,新的表结构修改已生效。修改Schema完成之后,您可以通过以下命令查看最新的表结构。DESCtable_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)
取消修改表结构您可以通过以下命令取消当前正在执行的作业。CANCELALTERTABLECOLUMNFROMtable_nameG;
4导入数据
为适配不同的数据导入需求,StarRocks系统提供了五种不同的导入方式,以支持不同的数据源或者导入方式。
BrokerLoad
BrokerLoad模式是一种异步数据导入模式,通过Broker进程访问并读取外部数据源,然后采用MySQL协议向StarRocks创建导入作业。BrokerLoad模式适用于源数据在Broker进程可访问的存储系统中的情景,可以支撑数据量达数百GB的导入作业。该导入方式支持的数据源有ApacheHive™等。
SparkLoad
SparkLoad是一种异步数据导入模式,通过外部的ApacheSpark™资源实现对导入数据的预处理,提高StarRocks大数据量的导入性能并且节省StarRocks集群的计算资源。SparkLoad模式适用于初次向StarRocks迁移大数据量的场景。该导入方式支持的数据源应位于ApacheSpark™可访问的存储系统中。通过SparkLoad可以基于ApacheHive™表实现全局字典的数据结构,对输入数据进行类型转换,保存原始值到编码值的映射,例如将字符串类型映射成整型。
StreamLoad
StreamLoad是一种同步数据导入模式。用户通过HTTP协议发送请求将本地文件或数据流导入到StarRocks中,并等待系统返回导入的结果状态,从而判断导入是否成功。StreamLoad模式适用于导入本地文件,或通过程序导入数据流中的数据。该导入方式支持的数据源有ApacheFlink®、CSV文件等。RoutineLoadRoutineLoad提供从指定数据源进行自动数据导入的功能。您可以通过MySQL协议提交例行导入作业,生成一个常驻线程,不间断地从数据源中读取数据并导入到StarRocks中。
InsertInto
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表。
注意:以上示例中,root为连接FE节点的用户名,默认密码为空,若使用的用户有密码,需在冒号后面补充密码;HTTP地址中IP为FE节点IP,端口为fe.conf中配置的httpport。
文章为作者独立观点,不代表股票配资公司观点