StarRocks官网摘要笔记

1.架构

StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE(Backend)两类进程,不依赖任何外部组件,方便部署与维护。FE 和 BE 模块都可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。StarRocks 提供 MySQL 协议接口,支持标准 SQL 语法。用户可通过 MySQL 客户端方便地查询和分析 StarRocks 中的数据。

2.搭建

脚本stargo
https://docs.starrocks.io/zh-cn/latest/administration/stargo
扩缩容及管理mysql语句管理

3.使用

StarRocks 支持四种数据模型,分别是明细模型 (Duplicate Key Model)、聚合模型 (Aggregate Key Model)、更新模型 (Unique Key Model) 和主键模型 (Primary Key Model)

1>明细模型

分析原始数据,例如原始日志、原始操作记录等。导入日志数据或者时序数据,主要特点是旧数据不会更新,只会追加新的数据
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;

2>聚合模型

当多条数据具有相同的排序键时,指标列会进行聚合。在分析统计和汇总数据时,聚合模型能够减少查询时所需要处理的数据,提升查询效率
通过分析网站或 APP 的访问流量,统计用户的访问总时长、访问总次数;广告厂商为广告主提供的广告点击总量、展示总量、消费统计等;通过分析电商的全年交易数据,获得指定季度或者月份中,各类消费人群的爆款商品。多为汇总类查询,比如 SUM、COUNT、MAX 等类型的查询
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;

3>更新模型

建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。相对于明细模型,更新模型简化了数据导入流程,能够更好地支撑实时和频繁更新的场景
实时和频繁更新的业务场景,例如分析电商订单。在电商场景中,订单的状态经常会发生变化,每天的订单更新量可突破上亿。更新模型可以视为聚合模型的特殊情况,指标列指定的聚合函数为 REPLACE,返回具有相同主键的一组数据中的最新数据
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;

4>主键模型

实时对接事务型数据至 StarRocks。事务型数据库中,除了插入数据外,一般还会涉及较多更新和删除数据的操作,因此事务型数据库的数据同步至 StarRocks 时,建议使用主键模型。通过 Flink-CDC 等工具直接对接 TP 的 Binlog,实时同步增删改的数据至主键模型,可以简化数据同步流程,并且相对于读时合并 (Merge-On-Read) 策略的更新模型,查询性能能够提升 3~10 倍
利用部分列更新轻松实现多流 JOIN。在用户画像等分析场景中,一般会采用大宽表方式来提升多维分析的性能,同时简化数据分析师的使用模型。而这种场景中的上游数据,往往可能来自于多个不同业务(比如来自购物消费业务、快递业务、银行业务等)或系统(比如计算用户不同标签属性的机器学习系统),主键模型的部分列更新功能就很好地满足这种需求,不同业务直接各自按需更新与业务相关的列即可,并且继续享受主键模型的实时同步增删改数据及高效的查询性能
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” = “3”,
“enable_persistent_index” = “true”);

create table users (
user_id bigint NOT NULL,
name string NOT NULL,
email string NULL,
address string NULL,
age tinyint NULL,
sex tinyint NULL,
last_active datetime,
property0 tinyint NOT NULL,
property1 tinyint NOT NULL,
property2 tinyint NOT NULL,
property3 tinyint NOT NULL,

) PRIMARY KEY (user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 4
PROPERTIES(“replication_num” = “3”,
“enable_persistent_index” = “true”);

4.数据导入

StarRocks 提供 Stream Load、Broker Load、 Routine Load、Spark Load 和 INSERT 多种导入方式,满足您在不同业务场景下的数据导入需求。

1>Stream Load ---- http 10 GB 以内

curl -v --location-trusted -u root: -H “strict_mode: true”
-H “format: json” -H “jsonpaths: [”KaTeX parse error: Expected group as argument to '\"' at end of input: .name\", \".code"]"
-H “columns: city,tmp_id, id = tmp_id * 100”
-T example2.json -XPUT
http://<fe_host>:<fe_http_port>/api/test_db/table2/_stream_load

2>Broker Load ---- 类似sqoop,使用mysql客户端操作 数十到数百 GB

LOAD LABEL test_db.label1
(
DATA INFILE(“hdfs://<hdfs_host>:<hdfs_port>/user/starrocks/file1.csv”)
INTO TABLE table1
COLUMNS TERMINATED BY “,”
(id, city)

DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/starrocks/file2.csv")
INTO TABLE table2
COLUMNS TERMINATED BY ","
(id, name, score)

)
WITH BROKER “mybroker”
(
“username” = “hdfs_username”,
“password” = “hdfs_password”
)
PROPERTIES
(
“timeout” = “3600”
);

3>Routine Load ---- 实时接入kafka 微批导入 MB 到 GB 级

CREATE ROUTINE LOAD example_db.example_tbl2_ordertest2 ON example_tbl2
COLUMNS(commodity_id, customer_name, country, pay_time, price, pay_dt=from_unixtime(pay_time, ‘%Y%m%d’))
PROPERTIES
(
“desired_concurrent_number”=“5”,
“format” =“json”,
“jsonpaths” =“[”KaTeX parse error: Expected group as argument to '\"' at end of input: …mmodity_id\",\".customer_name",“KaTeX parse error: Expected group as argument to '\"' at end of input: .country\",\".pay_time”,“$.price”]"
)
FROM KAFKA
(
“kafka_broker_list” =“<kafka_broker1_ip>:<kafka_broker1_port>,<kafka_broker2_ip>:<kafka_broker2_port>”,
“kafka_topic” = “ordertest2”,
“kafka_partitions” =“0,1,2,3,4”,
“property.kafka_default_offsets” = “OFFSET_BEGINNING”
);

4>INSERT ---- 外部表或者测试 跟内存相关

INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_1
SELECT * FROM source_wiki_edit;

SHOW LOAD WHERE label=“insert_load_wikipedia_1”\G

5> CloudCanal 类似datax

https://www.askcug.com/topic/75/cloudcanal%E7%A4%BE%E5%8C%BA%E7%89%88docker%E7%89%88%E5%AE%89%E8%A3%85-linux-macos/1

5 额外(flink,外部表)

flink_sql

tEnv.executeSql(
“CREATE TABLE USER_RESULT(” +
“name VARCHAR,” +
“score BIGINT” +
") WITH ( " +
“‘connector’ = ‘starrocks’,” +
“‘jdbc-url’=‘jdbc:mysql://fe1_ip:query_port,fe2_ip:query_port,fe3_ip:query_port?xxxxx’,” +
“‘load-url’=‘fe1_ip:http_port;fe2_ip:http_port;fe3_ip:http_port’,” +
“‘database-name’ = ‘xxx’,” +
“‘table-name’ = ‘xxx’,” +
“‘username’ = ‘xxx’,” +
“‘password’ = ‘xxx’,” +
“‘sink.buffer-flush.max-rows’ = ‘1000000’,” +
“‘sink.buffer-flush.max-bytes’ = ‘300000000’,” +
“‘sink.buffer-flush.interval-ms’ = ‘5000’,” +
// 自 2.4 版本,支持更新主键模型中的部分列。您可以通过以下两个属性指定需要更新的列。
// “‘sink.properties.partial_update’ = ‘true’,” +
// “‘sink.properties.row_delimiter’ = ‘k1,k2,k3’,” +
“‘sink.properties.column_separator’ = ‘\x01’,” +
“‘sink.properties.row_delimiter’ = ‘\x02’,” +
“‘sink.properties.*’ = ‘xxx’” + // stream load properties like 'sink.properties.columns' = 'k1, v1'
“‘sink.max-retries’ = ‘3’” +
“)”
);

外部表

CREATE EXTERNAL TABLE mysql_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=mysql
PROPERTIES
(
“host” = “127.0.0.1”,
“port” = “3306”,
“user” = “mysql_user”,
“password” = “mysql_passwd”,
“database” = “mysql_db_test”,
“table” = “mysql_table_test”
);

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值