StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以用 StarRocks 来支持多种数据分析场景的极速分析。
StarRocks 架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO (Cost Based Optimizer) 优化器,查询速度(尤其是多表关联查询)远超同类产品。
StarRocks 能很好地支持实时数据分析,并能实现对实时更新数据的高效查询。StarRocks 还支持现代化物化视图,进一步加速查询。
StarRocks 兼容 MySQL 协议,支持标准 SQL 语法,易于对接使用,全系统无外部依赖,高可用,易于运维管理。StarRocks 还兼容多种主流 BI 产品,包括 Tableau、Power BI、FineBI 和 Smartbi。
1.1 适用场景
StarRocks 可以满足企业级用户的多种分析需求,包括 OLAP (Online Analytical Processing) 多维分析、定制报表、实时数据分析和 Ad-hoc 数据分析等。
OLAP 多维分析
利用 StarRocks 的 MPP 框架和向量化执行引擎,用户可以灵活的选择雪花模型,星型模型,宽表模型或者预聚合模型。适用于灵活配置的多维分析报表,业务场景包括:
用户行为分析
用户画像、标签分析、圈人
高维业务指标报表
自助式报表平台
业务问题探查分析
跨主题业务分析
财务报表
系统监控分析
实时数据仓库
StarRocks 设计和实现了 Primary-Key 模型,能够实时更新数据并极速查询,可以秒级同步 TP (Transaction Processing) 数据库的变化,构建实时数仓,业务场景包括:
电商大促数据分析
物流行业的运单分析
金融行业绩效分析、指标计算
直播质量分析
广告投放分析
管理驾驶舱
探针分析APM(Application Performance Management)
高并发查询
StarRocks 通过良好的数据分布特性,灵活的索引以及物化视图等特性,可以解决面向用户侧的分析场景,业务场景包括:
广告主报表分析
零售行业渠道人员分析
SaaS 行业面向用户分析报表
Dashboard 多页面分析
统一分析
通过使用一套系统解决多维分析、高并发查询、预计算、实时分析查询等场景,降低系统复杂度和多技术栈开发与维护成本。
使用 StarRocks 统一管理数据湖和数据仓库,将高并发和实时性要求很高的业务放在 StarRocks 中分析,也可以使用 External Catalog 和外部表进行数据湖上的分析。
2.1 汇总节点Ip
#/etc/hosts
192.168.10.3 starrock1
192.168.10.4 starrock2
192.168.10.5 starrock3
2.2 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.3 关闭交换区
#消除交换内存到虚拟内存时对性能的扰动
echo 0 | sudo tee /proc/sys/vm/swappiness
2.4 使用 Overcommit
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
3.1 部署 FE 节点
进入 StarRocks-x.x.x/fe 路径
cd StarRocks-x.x.x/fe
修改 FE 配置文件 conf/fe.conf
# conf/fe.conf
meta_dir = ${STARROCKS_HOME}/meta
JAVA_HOME = ${JAVA_HOME}
#priority_networks为该节点设定唯一 IP
priority_networks=192.168.10.x
创建FE元数据路径
mkdir -p meta
3.2 部署 BE 节点
进入 StarRocks-x.x.x/be 路径
cd StarRocks-x.x.x/be
修改 BE 配置文件conf/be.conf
# conf/be.conf
#priority_networks为该节点设定唯一 IP
priority_networks=192.168.10.x
创建数据路径
mkdir -p storage
3.3 启动StarRocks集群
启动FE节点(starrock1)
#192.168.10.3 starrock1
StarRocks-x.x.x/fe/bin/start_fe.sh --daemon
通过 MySQL 客户端(或navicat)连接 StarRocks 以添加其他 FE 节点
#连接starrock1
mysql -h 192.168.10.3 -P9030 -uroot
#使用 MySQL 客户端连接已有 FE 节点,添加新 FE 节点的信息,包括角色、IP 地址、以及 Port
#添加 Follower FE 节点 ALTER SYSTEM ADD FOLLOWER "host:port";
#添加 Observer FE 节点 ALTER SYSTEM ADD OBSERVER "host:port";
#删除 Follower FE 节点 ALTER SYSTEM DROP FOLLOWER "host:port";
#删除 Observer FE 节点 ALTER SYSTEM drop OBSERVER "host:port";
ALTER SYSTEM ADD FOLLOWER "192.168.10.4:9010";
ALTER SYSTEM ADD FOLLOWER "192.168.10.5:9010";
启动其他FE节点
#192.168.10.4 starrock2
#192.168.10.5 starrock3
StarRocks-x.x.x/fe/bin/start_fe.sh --helper 192.168.10.3:9010 --daemon
通过 MySQL 客户端(或navicat)连接 StarRocks 以添加BE 节点
#连接starrock1
mysql -h 192.168.10.3 -P9030 -uroot
#使用 MySQL 客户端连接已有 FE 节点,添加新 FE 节点的信息,包括角色、IP 地址、以及 Port
#添加BE 节点 ALTER SYSTEM ADD BACKEND "host:port";
#删除BE 节点 ALTER SYSTEM decommission BACKEND "host:port";
ALTER SYSTEM ADD BACKEND "192.168.10.3:9050";
ALTER SYSTEM ADD BACKEND "192.168.10.4:9050";
ALTER SYSTEM ADD BACKEND "192.168.10.5:9050";
启动BE节点
#192.168.10.3 starrock1
#192.168.10.4 starrock2
#192.168.10.5 starrock3
StarRocks-x.x.x/be/bin/start_be.sh --daemon
查看状态
进入http://192.168.10.3:8030/system?path=//frontends,如果Join、Alive都为true则表示集群状态正常
进入http://192.168.10.3:8030/system?path=//backends,如果Alive都为true则表示集群状态正常
4.1 port xxx is used
修改fe.conf中相应被占用端口为闲置端口,重启即可。
4.2 Could not initialize class org.apache.doris.rpc.BackendServiceProxy
jdk环境错误,检查是否使用的是jre,如果使用的jre换成jdk即可,推荐使用oraclejdk版本1.8+。
4.3 current node is not added to the cluster, will exit
非第一台启动的fe节点首次加入集群时需要在集群中add相应节点信息,使用MySQL客户端连接已有的FE, 添加新实例的信息,信息包括角色、ip、port。
ALTER SYSTEM ADD FOLLOWER "host:port";
ALTER SYSTEM ADD OBSERVER "host:port";
4.4 backend ip saved in master does not equal to backend local ip xxx vs 127.0.0.1
检查机器是否多网卡多ip,需要在fe.conf中配置priority_networks为xxx,然后重启。
4.5 this replica exceeds max peimissible delta:5000ms
服务器同步超时
#各个节点运行
sed -i 's/^\s*server/#server/g;s/#\s*allow/allow/g;s/#\s*local/local/g' /etc/chrony.conf &&
echo "server"$'\t'"ntp1.aliyun.com"$'\t'"iburst" >> /etc/chrony.conf && systemctl restart chronyd &&
systemctl enable chronyd &&timedatectl set-timezone Asia/Shanghai
4.6 Failed to get scan range, no queryable replica found in tablet: 11903
定位磁盘不足,需要修改be.conf中的storage_root_path,可以指定多个目录,用;隔开。
5.1 insert导入
create database testdb;
use testdb;
-- insert导入数据
-- 创建数据表
CREATE table if not EXISTS test(
`id` int NOT NULL,
`name` STRING null
)ENGINE=OLAP DISTRIBUTED BY HASH(`id`) BUCKETS 8;
insert into testdb.test VALUES(5,'周杰伦'),(4,'刘德华');
SELECT * from testdb.test ORDER BY id;
5.2 hive或者hdfs导入
-- hdfs导入数据
create table testdb.result2_fy
(
id string ,
firm_eid string NULL,
firm_id string NULL,
firm_name string NULL,
usc_code string NULL,
reg_no string NULL,
org_code string NULL,
tax_no string NULL,
firm_name_sh string NULL,
firm_name_en string NULL,
firm_category string NULL,
ope_status string NULL,
legal_rep string NULL,
legal_rep_id string NULL,
legal_rep_type string NULL,
legal_rep_category string NULL,
firm_type string NULL,
firm_type_code string NULL,
firm_org_type string NULL,
firm_properties string NULL,
est_date string NULL,
cancel_date string NULL,
cancel_reason string NULL,
rev_date string NULL,
rev_certificates string NULL,
reg_agency string NULL,
reg_agency_area_code string NULL,
usc_code_area_code string NULL,
ind_econ_code string NULL,
ind_econ_name string NULL,
appr_date string NULL,
emp_num string NULL,
insured_emp_num string NULL,
ope_address string NULL,
reg_address string NULL,
ope_addr_code string NULL,
reg_addr_code string NULL,
open_date string NULL,
close_date string NULL,
ope_period string NULL,
province string NULL,
city string NULL,
district string NULL,
bd_longitude double NULL,
bd_latitude double NULL,
gd_longitude double NULL,
gd_latitude double NULL,
reg_cap double NULL,
reg_cap_cur string NULL,
rec_cap string NULL,
ope_scope string NULL,
firm_scale string NULL,
parent_aame string NULL,
parent_type string NULL,
profile string NULL,
firm_name_used string NULL,
logo_url string NULL,
is_history string NULL,
accused_num int NULL,
accuser_num int NULL,
capitalsize string NULL,
executor_num_oneyear int NULL,
executor_num_twoyear int NULL,
executor_num_threeyear int NULL,
docu_num_oneyear int NULL,
docu_num_twoyear int NULL,
docu_num_threeyear int NULL,
docu_amount_oneyear double NULL,
docu_amount_twoyear double NULL,
docu_amount_threeyear double NULL,
lian_num_oneyear int NULL,
lian_num_twoyear int NULL,
lian_num_threeyear int NULL
)ENGINE=OLAP DISTRIBUTED BY HASH(`id`) BUCKETS 8;
LOAD LABEL testdb.test2
(
-- 数据位置 hdfs://namenodeip:端口+路径
DATA INFILE("hdfs://10.8.16.99:8020/user/hive/warehouse/team1_project.db/result2_fy/*")
-- 表名
INTO TABLE result2_fy
-- 列分隔符
COLUMNS TERMINATED BY "•"
)
WITH BROKER
(
-- 用户密码
"username" = "root",
"password" = "root"
)
PROPERTIES
(
-- 超时时间
"timeout" = "36000"
);
5.3 python导入
python导入数据
创表SQL
jsonpaths用法介绍 https://www.cnblogs.com/youring2/p/10942728.html
CREATE TABLE `table1`
(
`id` int(11) NOT NULL COMMENT "用户 ID",
`name` varchar(65533) NULL COMMENT "用户姓名",
`score` int(11) NOT NULL COMMENT "用户得分"
)
ENGINE=OLAP
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10;
CREATE TABLE `table2`
(
`id` int(11) NOT NULL COMMENT "城市 ID",
`city` varchar(65533) NULL COMMENT "城市名称"
)
ENGINE=OLAP
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10;
Python代码
import requests,json
#验证密码
Session=requests.Session()
Session.auth=('root','')
#csv导入
table='table1'
headers_csv={
'label':'123',
#分隔符
'column_separator':',',
#字段
'columns': 'id, name, score'
}
'''
1,Lily,23
2,Rose,23
3,Alice,24
4,Julia,25
'''
data=open('score.csv','r').read()
r=Session.put(f'http://10.8.16.200:8040/api/testdb/{table}/_stream_load',headers=headers_csv,data=data)
r.json()
#json导入
table='table2'
#请求头
headers_json={
'Content-type': 'application/json',
"Expect": "100-continue",
'strict_mode': 'true',
'format': 'json',
'jsonpaths': '[\"$.name\", \"$.code\"]',
'columns': 'city,tmp_id, id = tmp_id * 100'
}
for i in [{"name": "上海", "code": 1},{"name": "重庆", "code": 3}]:
data=json.dumps(i)
r=Session.put(f'http://10.8.16.200:8040/api/testdb/{table}/_stream_load',headers=headers_json,data=data)
print(r.json())