Doris,StarRocks,ByteHouses调研

  1. Doris github地址 https://github.com/apache/doris
  2. Doris官网 https://doris.apache.org/
  3. Starrocks github地址 https://github.com/StarRocks/starrocks/
  4. Starrocks官网 https://docs.starrocks.io/zh-cn/latest/introduction/StarRocks_intro

这里我们先给出Doris的一个测试简介,再到简单的物理部署一个集群,在测试下从S3导入数据

其次是StarRocks进行一个测试流程,流程基本如下,从简单部署一个集群,再测试下从S3导入数据,笔者在写这个的时候,由于Doris不支持批量导入,以及开始全力调研Starrocks了

那么我们先简单说下Drois

    1. Doris架构

分为了Fe和Be,FE负责用户接入,节点管理,元数据管理,以及查询计划构建。BE负责数据存储,查询计划执行。

Doris采用MySQL链接协议,支持MySQl语法,支持物化视图

考虑使用 4台机器

一台FE Follower 三台BE, 同时某一台 BE部署机器上部署了Observer FE

    1. Doris的物理部署
  1. 安装gcc

yum install gcc

  1. 下载并安装java,要求java版本为1.8

wget –no-check-certificate –no-cookies \

–header “Cookie: oraclelicense=accept-securebackup-cookie” \

http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz

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

  1. 下载解压 doris

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

  1. 打镜像方便快速扩容
  2. 进入doris的目录,进行配置,这里先配置fe节点

vim ./conf/fe.conf

#配置CIDR

priority_networks = 192.168.0.0/16

#配置元数据目录

meta_dir=/etc/doris/doris-fe-meta

  1. 启动fe

bash ./bin/start_fe.sh –daemon

#利用curl http://127.0.0.1:8030/api/bootstrap 进行校验

  1. 启动三台机器用于be,分别配置

vim conf/be.conf

priority_networks = 192.168.0.0/16

storage_root_path=/etc/doris/data_dir

mkdir -p /etc/doris/data_dir

  1. 启动be

sysctl -w vm.max_map_count=2000000

bin/start_be.sh –daemon

  1. 加入节点

ALTER SYSTEM ADD BACKEND “ip:port”;

增加节点,达到最小节点数后就可以使用客户端链接了

    1. 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”

);

发表评论

邮箱地址不会被公开。 必填项已用*标注