Doris,StarRocks,ByteHouses调研
- Doris github地址 https://github.com/apache/doris
- Doris官网 https://doris.apache.org/
- Starrocks github地址 https://github.com/StarRocks/starrocks/
- Starrocks官网 https://docs.starrocks.io/zh-cn/latest/introduction/StarRocks_intro
这里我们先给出Doris的一个测试简介,再到简单的物理部署一个集群,在测试下从S3导入数据
其次是StarRocks进行一个测试流程,流程基本如下,从简单部署一个集群,再测试下从S3导入数据,笔者在写这个的时候,由于Doris不支持批量导入,以及开始全力调研Starrocks了
那么我们先简单说下Drois
-
- Doris架构
分为了Fe和Be,FE负责用户接入,节点管理,元数据管理,以及查询计划构建。BE负责数据存储,查询计划执行。
Doris采用MySQL链接协议,支持MySQl语法,支持物化视图
考虑使用 4台机器
一台FE Follower 三台BE, 同时某一台 BE部署机器上部署了Observer FE
-
- Doris的物理部署
yum install gcc
wget –no-check-certificate –no-cookies \ –header “Cookie: oraclelicense=accept-securebackup-cookie” \ vi /etc/profile export JAVA_HOME=/usr/local/java/jdk-20.0.1 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0-beta-bin-x64.tar.gz tar -zxvf ./apache-doris-2.0-beta-bin-x64.tar.gz -C /etc/doris
vim ./conf/fe.conf #配置CIDR priority_networks = 192.168.0.0/16 #配置元数据目录 meta_dir=/etc/doris/doris-fe-meta
bash ./bin/start_fe.sh –daemon #利用curl http://127.0.0.1:8030/api/bootstrap 进行校验
vim conf/be.conf priority_networks = 192.168.0.0/16 storage_root_path=/etc/doris/data_dir mkdir -p /etc/doris/data_dir
sysctl -w vm.max_map_count=2000000 bin/start_be.sh –daemon
ALTER SYSTEM ADD BACKEND “ip:port”; 增加节点,达到最小节点数后就可以使用客户端链接了 |
-
- doris的表模型
1.聚合模型
某些键需要被设置为聚合键,在AGGREGATE KEY相同的时候执行聚合操作 CREATE TABLE IF NOT EXISTS example_db.example_tbl ( `user_id` LARGEINT NOT NULL COMMENT “用户id”, `date` DATE NOT NULL COMMENT “数据灌入日期时间”, `city` VARCHAR(20) COMMENT “用户所在城市”, `age` SMALLINT COMMENT “用户年龄”, `sex` TINYINT COMMENT “用户性别”, `last_visit_date` DATETIME REPLACE DEFAULT “1970-01-01 00:00:00” COMMENT “用户最后一次访问时间”, `cost` BIGINT SUM DEFAULT “0” COMMENT “用户总消费”, `max_dwell_time` INT MAX DEFAULT “0” COMMENT “用户最大停留时间”, `min_dwell_time` INT MIN DEFAULT “99999” COMMENT “用户最小停留时间” ) AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( “replication_allocation” = “tag.location.default: 1” ); 目前支持的聚合有 AggregationType 目前有以下四种聚合方式: SUM:求和,多行的 Value 进行累加。 REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。 MAX:保留最大值。 MIN:保留最小值。 2.Unique 模型 支持读时合并和写时合并,明显看来是写时合并速度快 读时合并的使用和上面的聚合模型一致,建表语句如下 CREATE TABLE IF NOT EXISTS example_db.example_tbl ( `user_id` LARGEINT NOT NULL COMMENT “用户id”, `username` VARCHAR(50) NOT NULL COMMENT “用户昵称”, `city` VARCHAR(20) REPLACE COMMENT “用户所在城市”, `age` SMALLINT REPLACE COMMENT “用户年龄”, `sex` TINYINT REPLACE COMMENT “用户性别”, `phone` LARGEINT REPLACE COMMENT “用户电话”, `address` VARCHAR(500) REPLACE COMMENT “用户地址”, `register_time` DATETIME REPLACE COMMENT “用户注册时间” ) AGGREGATE KEY(`user_id`, `username`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( “replication_allocation” = “tag.location.default: 1” ); 而写时合并则是需要配置相关配置项, “enable_unique_key_merge_on_write” = “true” CREATE TABLE IF NOT EXISTS example_db.example_tbl ( `user_id` LARGEINT NOT NULL COMMENT “用户id”, `username` VARCHAR(50) NOT NULL COMMENT “用户昵称”, `city` VARCHAR(20) COMMENT “用户所在城市”, `age` SMALLINT COMMENT “用户年龄”, `sex` TINYINT COMMENT “用户性别”, `phone` LARGEINT COMMENT “用户电话”, `address` VARCHAR(500) COMMENT “用户地址”, `register_time` DATETIME COMMENT “用户注册时间” ) UNIQUE KEY(`user_id`, `username`) DISTRIBUTED BY HASH(`user_id`) BUCKETS 1 PROPERTIES ( “replication_allocation” = “tag.location.default: 1”, “enable_unique_key_merge_on_write” = “true” ); 建表的时候无需指定 REPLACE操作 3.Duplicate 数据既没有主键,也没有聚合需求。因此,我们引入 Duplicate 数据模型来满足这类需求 CREATE TABLE IF NOT EXISTS example_db.example_tbl ( `timestamp` DATETIME NOT NULL COMMENT “日志时间”, `type` INT NOT NULL COMMENT “日志类型”, `error_code` INT COMMENT “错误码”, `error_msg` VARCHAR(1024) COMMENT “错误详细信息”, `op_id` BIGINT COMMENT “负责人id”, `op_time` DATETIME COMMENT “处理时间” ) DUPLICATE KEY(`timestamp`, `type`, `error_code`) DISTRIBUTED BY HASH(`type`) BUCKETS 1 PROPERTIES ( “replication_allocation” = “tag.location.default: 1” ); 这时候的DUPLICATE KEY不是用于去重的了,而是用于进行排序的 如果连排序的需求不需要的话,那可以在表配置中配置 “enable_duplicate_without_keys_by_default” = “true” CREATE TABLE IF NOT EXISTS example_db.example_tbl ( `timestamp` DATETIME NOT NULL COMMENT “日志时间”, `type` INT NOT NULL COMMENT “日志类型”, `error_code` INT COMMENT “错误码”, `error_msg` VARCHAR(1024) COMMENT “错误详细信息”, `op_id` BIGINT COMMENT “负责人id”, `op_time` DATETIME COMMENT “处理时间” ) DISTRIBUTED BY HASH(`type`) BUCKETS 1 PROPERTIES ( “replication_allocation” = “tag.location.default: 1”, “enable_duplicate_without_keys_by_default” = “true” ); Aggregate 模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。但是该模型对 count(*) 查询很不友好。同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。 Unique 模型针对需要唯一主键约束的场景,可以保证主键唯一性约束。但是无法利用 ROLLUP 等预聚合带来的查询优势。 对于聚合查询有较高性能需求的用户,推荐使用自1.2版本加入的写时合并实现。 Unique 模型仅支持整行更新,如果用户既需要唯一主键约束,又需要更新部分列(例如将多张源表导入到一张 doris 表的情形),则可以考虑使用 Aggregate 模型,同时将非主键列的聚合类型设置为 REPLACE_IF_NOT_NULL。具体的用法可以参考语法手册 Duplicate 适合任意维度的 Ad-hoc 查询。虽然同样无法利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势(只读取相关列,而不需要读取所有 Key 列)。 |
测试从S3导入数据
https://doris.apache.org/zh-CN/docs/dev/data-operate/import/import-scenes/external-storage-load
支持导入方式和支持的格式
Broker Load parquet、orc、csv、gzip
Stream Load csv、json、parquet、orc
Routine Load csv、json
MySQL Load csv
LOAD LABEL example_db.exmpale_label_2
(
DATA INFILE(“s3://path”)
INTO TABLE example_tbl
COLUMNS TERMINATED BY “,”
)
WITH S3
(
“AWS_ENDPOINT” = “s3.cn-north-1.amazonaws.com.cn”,
“AWS_ACCESS_KEY” = “xxxxxxxx”,
“AWS_SECRET_KEY”=”xxxxxxxx”,
“AWS_REGION” = “cn-north-1”
)
PROPERTIES
(
“timeout” = “3600”
);