DorisDB的介绍与环境部署(StarRocks)可以参考我之前的文章哦:大数据Hadoop之——DorisDB介绍与环境部署(StarRocks)
官方文档:https://docs.starrocks.com/zh-cn/main/loading/Loading_intro
在成功 部署 StarRocks 集群 后,您可以通过 MySQL 客户端连接任意一个 FE 节点的 query_port(默认为 9030
)以连接 StarRocks。StarRocks 内置 root 用户,密码默认为空。
cd $STARROCKS_HOME
# 启动FE
./fe/bin/start_fe.sh --daemon
# 启动BE
./be/bin/start_be.sh --daemon
# 启动broker
./apache_hdfs_broker/bin/start_broker.sh --daemon
# 连接
mysql -h 127.0.0.1 -P9030 -uroot
show proc '/frontends'\G;
show proc '/backends'\G;
web UI:http://192.168.182.110:8030/system
使用 root 用户创建 example_db 数据库。
CREATE DATABASE example_db;
show databases;
说明:与 MySQL 的表结构类似,Information_schema 包含当前 StarRocks 集群的元数据信息。
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 65533 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)
DISTRIBUTED BY HASH(recruit_date, region_num) BUCKETS 8;
【错误】
ERROR 1064 (HY000): Failed to find enough host in all backends. need: 3
【原因】这是因为默认需要3个副本,副本数必须是<=BE数,需要带上PROPERTIES,设置副本数。
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 65533 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)
DISTRIBUTED BY HASH(recruit_date, region_num) BUCKETS 8
PROPERTIES("replication_num" = "2");
【温馨提示】注意:在 StarRocks 中,字段名不区分大小写,表名区分大小写。
StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key)。明细模型中由 DUPLICATE KEY
指定排序列。以上示例中的 recruit_date 以及 region_num 两列为排序列。
【温馨提示】排序列在建表时应定义在其他列之前。排序键详细描述以及不同数据模型的表的设置方法请参考 排序键。
StarRocks 表中支持多种字段类型,除以上示例中已经列举的字段类型,还支持 BITMAP
类型,HLL
类型,ARRAY
类型,字段类型介绍详见官方文档 数据类型章节。
【温馨提示】在建表时,您应尽量使用精确的类型。例如,整形数据不应使用字符串类型,INT 类型即可满足的数据不应使用 BIGINT 类型。精确的数据类型能够更好的发挥数据库的性能。
PARTITION
关键字用于给表 创建分区,StarRocks 支持动态生成分区,详见 动态分区管理。DISTRIBUTED
关键字用于给表 创建分桶,以上示例中使用 recruit_date 以及 region_num 两个字段通过 Hash 算法创建 8 个桶。DUPLICATE
关键字表示当前表为明细模型,KEY
中的列表示当前表的排序列。StarRocks 支持多种数据模型,分别为 明细模型,聚合模型,更新模型,主键模型。不同模型的适用于多种业务场景,合理选择可优化查询效率。
StarRocks 默认会给 Key 列创建稀疏索引加速查询,具体规则见 排序键。支持的索引类型有 Bitmap 索引,Bloomfilter 索引 等。
默认 ENGINE(引擎) 类型为 OLAP
,对应 StarRocks 集群内部表。其他可选项包括 mysql,elasticsearch,hive,以及 ICEBERG,分别代表所创建的表为相应类型的 外部表。
您可以通过 ALTER TABLE
命令可以修改表的 Schema,包括增加列,删除列,修改列类型(暂不支持修改列名称),改变列顺序。
【增加列】
ALTER TABLE detailDemo ADD COLUMN uv BIGINT DEFAULT '0' after ispass;
【查看修改表结构作业状态】
SHOW ALTER TABLE COLUMN\G;
当作业状态为 FINISHED
,则表示作业完成,新的表结构修改已生效。
【取消修改表结构】
您可以通过以下命令取消当前正在执行的作业。
CANCEL ALTER TABLE COLUMN FROM table_name\G;
【创建用户并授权】
example_db 数据库创建完成之后,您可以使用 root 账户创建 test 账户,并授予其 example_db 的读写权限 。
CREATE USER 'test' IDENTIFIED by '123456';
GRANT ALL on example_db to test;
通过登录被授权的 test 账户,其他用户就可以操作 example_db 数据库了。
mysql -h 127.0.0.1 -P9030 -utest -p
输入密码:123456
show databases;
show tables from example_db;
范围查找时,使用前缀索引 (Prefix Index),如下图所示。
一张表中的数据组织主要由三部分构成:
由此可见,查找维度列的前缀的过程包含以下五个步骤:
StarRocks 支持布隆过滤器 (Bloom Filter)、ZoneMap 索引和 位图 (Bitmap) 索引等列级别的索引技术:
布隆过滤器有助于快速判断数据块中不含所查找的值。
ZoneMap 索引有助于通过数据范围快速过滤出待查找的值。
位图索引有助于快速计算出枚举类型的列满足一定条件的行。
建表时,您需要指定数据模型 (Data Model),这样数据导入至数据模型时,StarRocks 会按照排序健对数据进行排序、处理和存储。
StarRocks 支持四种数据模型,分别是明细模型 (Duplicate Key Model)、聚合模型 (Aggregate Key Model)、更新模型 (Unique Key Model) 和主键模型 (Primary Key Model)。这四种数据模型能够支持多种数据分析场景,例如日志分析、数据汇总分析、实时分析等。
明细模型是默认的建表模型。创建表时,支持定义排序键。如果查询的过滤条件包含排序键,则 StarRocks 能够快速地过滤数据,提高查询效率。明细模型适用于分析日志数据等,支持追加新数据,不支持修改历史数据。
【适用场景】
分析原始数据,例如原始日志、原始操作记录等。
查询方式灵活,不需要局限于预聚合的分析方式。
导入日志数据或者时序数据,主要特点是旧数据不会更新,只会追加新的数据。
【示例】
例如,需要分析某时间范围的某一类事件的数据,则可以将事件时间(event_time)和事件类型(event_type)作为排序键。
CREATE TABLE IF NOT EXISTS detail (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
device_code INT COMMENT "device code",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES("replication_num" = "2");
建表时,支持定义排序键和指标列,并为指标列指定聚合函数。当多条数据具有相同的排序键时,指标列会进行聚合。在分析统计和汇总数据时,聚合模型能够减少查询时所需要处理的数据,提升查询效率。
【适用场景】
适用于分析统计和汇总数据。比如:
通过分析网站或 APP 的访问流量,统计用户的访问总时长、访问总次数。
广告厂商为广告主提供的广告点击总量、展示总量、消费统计等。
通过分析电商的全年交易数据,获得指定季度或者月份中,各类消费人群的爆款商品。
【示例】
例如某一段时间内,来自不同城市的用户,访问不同网页的总次数。则可以将网页地址 site_id、日期 date 和城市代码 city_code 作为排序键,将访问次数 pv 作为指标列,并为指标列 pv 指定聚合函数为 SUM。
CREATE TABLE IF NOT EXISTS example_db.aggregate_tbl (
site_id LARGEINT NOT NULL COMMENT "id of site",
date DATE NOT NULL COMMENT "time of event",
city_code VARCHAR(20) COMMENT "city_code of user",
pv BIGINT SUM DEFAULT "0" COMMENT "total page views"
)
DISTRIBUTED BY HASH(site_id) BUCKETS 8
PROPERTIES("replication_num" = "2");
建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。相对于明细模型,更新模型简化了数据导入流程,能够更好地支撑实时和频繁更新的场景。
【适用场景】
实时和频繁更新的业务场景,例如分析电商订单。在电商场景中,订单的状态经常会发生变化,每天的订单更新量可突破上亿。
【示例】
在电商订单分析场景中,经常按照日期对订单状态进行统计分析,则可以将经常使用的过滤字段订单创建时间 create_time、订单编号 order_id 作为主键,其余列订单状态 order_state 和订单总价 total_price 作为指标列。这样既能够满足实时更新订单状态的需求,又能够在查询中进行快速过滤。
CREATE TABLE IF NOT EXISTS orders (
create_time DATE NOT NULL COMMENT "create time of an order",
order_id BIGINT NOT NULL COMMENT "id of an order",
order_state INT COMMENT "state of an order",
total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 8
PROPERTIES("replication_num" = "2");
StarRocks 1.19
版本推出了主键模型 (Primary Key Model) 。建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。相对于更新模型,主键模型在查询时不需要执行聚合操作,并且支持谓词下推和索引使用,能够在支持实时和频繁更新等场景的同时,提供高效查询。
【适用场景】
主键模型适用于实时和频繁更新的场景,例如:
【示例】
例如,需要实时分析用户情况,则可以将用户 ID user_id 作为主键,其余为指标列。建表语句如下:
create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
) PRIMARY KEY (dt, order_id)
PARTITION BY RANGE(`dt`) (
PARTITION p20210820 VALUES [('2021-08-20'), ('2021-08-21')),
PARTITION p20210821 VALUES [('2021-08-21'), ('2021-08-22')),
PARTITION p20210929 VALUES [('2021-09-29'), ('2021-09-30')),
PARTITION p20210930 VALUES [('2021-09-30'), ('2021-10-01'))
) DISTRIBUTED BY HASH(order_id) BUCKETS 4
PROPERTIES("replication_num" = "2");
【温馨提示】
enable_persistent_index
:是否持久化主键索引,同时使用磁盘和内存存储主键索引,避免主键索引占用过大内存空间。取值为 true 或者 false。如果磁盘为固态硬盘 SSD,则建议设置为 true。自2.3.0
版本起,StarRocks 支持配置该参数。
现代分布式数据库中,常见的数据分布方式有如下四种:Round-Robin
、Range
、List
和 Hash
。如下图所示:
Round-Robin
:以轮询的方式把数据逐个放置在相邻节点上。
Range
:按区间进行数据分布。如上图所示,区间 [1-3]、[4-6] 分别对应不同的范围 (Range)。
List
:直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,多个不同的取值可能也会映射到相同节点上。
Hash
:通过哈希函数把数据映射到不同节点上。
为了更灵活地划分数据,除了单独采用上述四种数据分布方式之一以外,您还可以根据具体的业务场景需求组合使用这些数据分布方式。常见的组合方式有
Hash+Hash
、Range+Hash
、Hash+List
。
StarRocks 支持如下两种数据分布方式:
CREATE TABLE site_access(
site_id INT DEFAULT '10',
city_code SMALLINT,
user_name VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id) BUCKETS 10
PROPERTIES("replication_num" = "2");
CREATE TABLE site_access2(
event_day DATE,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)
(
PARTITION p1 VALUES LESS THAN ("2020-01-31"),
PARTITION p2 VALUES LESS THAN ("2020-02-29"),
PARTITION p3 VALUES LESS THAN ("2020-03-31")
)
DISTRIBUTED BY HASH(site_id) BUCKETS 10
PROPERTIES("replication_num" = "2");
StarRocks 支持两种导入模式:同步导入和异步导入。
同步导入是指用户创建导入作业,StarRocks 同步执行,执行完成后返回导入结果。您可以通过返回的导入结果判断导入作业是否成功。
支持同步模式的导入方式有 Stream Load
和 INSERT INTO
。
导入过程如下:
创建导入作业。
查看 StarRocks 返回的导入结果。
判断导入结果。如果导入结果为失败,可以重试导入作业。
【示例】Stream Load
先创建测试库表
create database testDb;
CREATE TABLE testDb.testTbl(
id INT DEFAULT '10',
city VARCHAR(32) DEFAULT ''
)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES("replication_num" = "2");
样例数据:
cat>jsontest.json<<EOF
{"name": "北京", "code": 2}
EOF
执行数据导入
# 语法
#curl --location-trusted -u user:passwd [-H ""...] -T data.file -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load
# 导入json
curl -v --location-trusted -u root: \
-H "format: json" -H "jsonpaths: [\"$.name\", \"$.code\"]" \
-H "columns: city,tmp_id, id = tmp_id * 100" \
-T jsontest.json \
http://127.0.0.1:8030/api/testDb/testTbl/_stream_load
【示例】INSERT INTO
创建导入任务
CREATE DATABASE IF NOT EXISTS load_test;
USE load_test;
CREATE TABLE insert_wiki_edit
(
event_time DATETIME,
channel VARCHAR(32) DEFAULT '',
user VARCHAR(128) DEFAULT '',
is_anonymous TINYINT DEFAULT '0',
is_minor TINYINT DEFAULT '0',
is_new TINYINT DEFAULT '0',
is_robot TINYINT DEFAULT '0',
is_unpatrolled TINYINT DEFAULT '0',
delta INT SUM DEFAULT '0',
added INT SUM DEFAULT '0',
deleted INT SUM DEFAULT '0'
)
AGGREGATE KEY(event_time, channel, user, is_anonymous, is_minor, is_new, is_robot, is_unpatrolled)
PARTITION BY RANGE(event_time)
(
PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user) BUCKETS 3
PROPERTIES("replication_num" = "1");
通过values导入数据
INSERT INTO insert_wiki_edit VALUES
("2015-09-12 00:00:00","#en.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),
("2015-09-12 00:00:00","#ca.wikipedia","PereBot",0,1,0,1,0,17,17,0);
通过select导入数据
# 指定label
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_1
SELECT * FROM routine_wiki_edit;
# 指定分区导入,只导入到p06和p12分区
INSERT INTO insert_wiki_edit PARTITION(p06, p12)
WITH LABEL insert_load_wikipedia_2
SELECT * FROM routine_wiki_edit;
# 指定部分列导入,只导入event_time和channel字段
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_3 (event_time, channel)
SELECT event_time, channel FROM routine_wiki_edit;
异步导入是指创建导入作业以后,StarRocks 直接返回创建成功,但创建成功不代表数据已经导入成功。StarRocks 会异步执行导入作业。在导入作业创建成功以后,您需要通过轮询的方式查看导入作业的状态。如果导入作业创建失败,可以根据失败信息,判断是否需要重试。
支持异步模式的导入方式有 Broker Load
、Routine Load
和 Spark Load
。
导入过程如下:
创建导入作业。
查看 StarRocks 返回的作业创建结果。
判断作业创建结果。如果作业创建成功,进入步骤 4;如果作业创建失败,可以回到步骤 1,尝试重试导入作业。
轮询查看导入作业的状态,直到状态变为 FINISHED 或 CANCELLED。
在异步的导入方式 Broker Load 和 Spark Load 中,一个导入作业的执行流程主要分为 5 个阶段,如下图所示:
每个阶段的描述如下:
PENDING
该阶段是指提交导入作业后,等待 FE 调度执行。
ETL
该阶段执行数据的预处理,包括清洗、分区、排序、聚合等。
说明:如果是 Broker Load 作业,该阶段会直接完成。
LOADING
该阶段先对数据进行清洗和转换,然后将数据发送给 BE 处理。当数据全部导入后,进入等待生效过程,此时,导入作业的状态依旧是 LOADING。
FINISHED
在导入作业涉及的所有数据均生效后,作业的状态变成 FINISHED,此时,导入的数据均可查询。FINISHED 是导入作业的最终状态。
CANCELLED
在导入作业的状态变为 FINISHED 之前,您可以随时取消作业。另外,如果导入出现错误,StarRocks 系统也会自动取消导入作业。作业取消后,进入 CANCELLED 状态。CANCELLED 也是导入作业的一种最终状态。
StarRocks 提供
Stream Load
、Broker Load
、Routine Load
、Spark Load
和INSERT INTO
多种导入方式,满足您在不同业务场景下的数据导入需求。
下图详细展示了在各种数据源场景下,应该选择哪一种导入方式:
StarRocks 支持导入如下数据类型:
整型类:包括 TINYINT、SMALLINT、INT、BIGINT 和 LARGEINT。举例: 1 | 1000 | 1234。
浮点类:包括 FLOAT、DOUBLE 和 DECIMAL。举例:1.1、0.23、.356。
日期类:包括 DATE 和 DATETIME。举例:2017-10-03、2017-06-13 12:34:03。
字符串类:包括 CHAR 和 VARCHAR。举例:I am a student、a。
NULL 值:举例:\N。
StarRocks 拥有 Export 一种将数据导出并存储到其他介质上的功能。该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS/阿里云OSS/AWS S3(或者兼容S3协议的对象存储) 等。
导出作业的执行流程
上图描述的处理流程主要包括:
用户提交一个 Export 作业到 FE。
PENDING阶段:FE 生成一个 ExportPendingTask,向 BE 发送 snapshot 命令,对所有涉及到的 Tablet 做一个快照,并生成多个查询计划。
EXPORTING阶段:FE 生成一个 ExportExportingTask,BE和Broker会根据FE生成的查询计划配合完成数据导出工作。
其实这里只是稍微介绍了StarRocks核心概念,想要了解更多StarRocks,请查看官方文档,https://docs.starrocks.com/zh-cn/main/introduction/StarRocks_intro,有什么疑问也欢迎给我留言哦~