StarRocks数据库安装测试

标签: 无 分类: 未分类 创建时间:2021-12-22 14:10:43 更新时间:2023-10-20 11:23:26

1.前言

StarRocks原名叫DorisDB,和Apache Doris不是一个东西,反正就是Apache Doris的一个分支,又增加了自己的一些技术,开源之前蹭了很多Apache Doris的流量,导致两家闹的不可开交,这里我就不讲两者的渊源了,反正可能StarRocks的人缘不是很好,但是也不影响我使用这个数据进行基本的查询。

我的基本环境是Hyper-V虚拟出的配置好开发环境的CentOS8,安装了mysql8.0,具体安装可以查看 Post not found: MySql安装 MySql安装 ,ip地址为 192.168.1.95

2.下载

去官方下载 安装包

3.安装

我这里测试了单机安装,为了不必要的麻烦,我将下载的安装包,解压到了 /usr/local/starroces-1.19.4 目录下,编辑了 /etc/profile 文件,添加了 STARROCKS_HOME=/usr/local/starroces-1.19.4 环境变量。

参考文章:
1.Doris端口列表 对默认的端口有一个概念,可能会和hadoop的部分端口重合

1.启动fe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## fe端口
ss -antpl|grep -E '8030|9010|9020|9030'

## 进入fe目录
cd fe

## 创建元数据目录
mkdir -p meta

## 启动fe,以服务的方式进行启动
bin/start_fe.sh --daemon

## 查看启动,java进程确认"StarRocksFe"存在

## 使用mysql客户端链接,这里默认root用户密码为空,端口为fe/conf/fe.conf中的query_port配置项,默认为9030
mysql -h 127.0.0.1 -P9030 -uroot
## 查看FE状态
mysql> SHOW PROC '/frontends'\G

## 停止
bin/stop_fe.sh
参考文章:
1.StarRocks BE服务常见问题处理看这篇就够了 查看端口占用情况,修改fe.conf或be.conf中的配置

2.启动be

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## 查看端口占用,修改be.conf
ss -antpl|grep -E '9060|9050|8040|8060'*

## 进入be目录
cd be

## 创建目录
mkdir -p storage

## 启动be,以服务的方式进行启动
bin/start_be.sh --daemon


## 使用mysql客户端链接,这里默认root用户密码为空,端口为fe/conf/fe.conf中的query_port配置项,默认为9030
mysql -h 127.0.0.1 -P9030 -uroot

## 添加节点,链接fe,P地址为和priority_networks设置匹配的IP,portheartbeat_service_port,默认为9050
mysql> ALTER SYSTEM ADD BACKEND "192.168.1.95:9050";

## 删除节点
alter system decommission backend "be_host:be_heartbeat_service_port";

## 查看状态,如果isAlive为true,则说明BE正常接入集群。如果BE没有正常接入集群,请查看log目录下的be.WARNING日志文件确定原因。
mysql> SHOW PROC '/backends'\G

## 停止
bin/stop_be.sh

3.创建用户并授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---- 登录,默认是没有用户名密码的
mysql -h 127.0.0.1 -P9030 -uroot

---- 创建一个有密码用户,允许从 任何地方登录
CREATE USER jack@'%' IDENTIFIED BY '123456';

---- 授予所有库和表的只读权限给用户
GRANT SELECT_PRIV ON *.* TO 'jack'@'%';

---- 授予所有库和表的创建数据库、表、视图的权限
GRANT Create_priv ON *.* TO 'jack'@'%';

---- 授予多个权限
GRANT SELECT_PRIV,LOAD_PRIV,ALTER_PRIV,CREATE_PRIV,DROP_PRIV ON *.* TO 'jack'@'%';

---- 删除用户
DROP USER jack;
参考文章:
1.StarRocks用户权限
2.用户权限 官方文档的用户权限配置
3.GRANT 官方文档关于GRANT语句的使用

4.创建数据库和数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 使用mysql客户端链接,这里默认root用户密码为空,端口为fe/conf/fe.conf中的query_port配置项,默认为9030
mysql -h 127.0.0.1 -P9030 -uroot
## 使用用户名密码登陆
mysql -h 127.0.0.1 -P9030 -uroot -p123

## 查看所有数据库
show databases;
## 创建数据库db_
create database db_;

## 进入数据库
use db_;

## 创建一个 olap 表,使用 HASH 分桶,使用列存,相同key的记录进行聚合
CREATE TABLE realtime
(
SiteNo int NOT NULL,
RecordTime datetime NOT NULL,
Alarm int NULL,
)
ENGINE=olap
COMMENT "realtime"
DISTRIBUTED BY HASH(RecordTime) BUCKETS 10
PROPERTIES ("storage_type"="column","replication_num"="1");

问题

(1) Failed to find enough host in all backends. need: 3
StarRocks的副本数是不能大于BE节点数的,由于当前仅有一个BE节点,我们建表时务必注意指定数据为单副本,也就是在建表的时候,要增加 “replication_num”=”1”

1
2
3
4
5
6
7
8
9
10
CREATE TABLE customer (
c_custkey INT,
c_name VARCHAR(26),
c_city VARCHAR(11)
)
DUPLICATE KEY(c_custkey)
DISTRIBUTED BY HASH (c_custkey) BUCKETS 10
PROPERTIES (
"replication_num"="1"
);

(2) java.sql.SQLException: No suitable driver found

(3) LOAD command denied to user ‘default_cluster:ztzn’@’192.168.1.1’ for table ‘siteinfo’

这个问题,主要是用户的权限不足导致的。

(4) primary key tablet do not support delete statement yet
意思是不支持单个的删除,可以使用TRUNCATE TABLE 命令 删除该表所有数据。

【解决】
我这里的问题,注意就是字段不存在的问题。

1
2
---- 清空 example_db 下的表 tbl
TRUNCATE TABLE example_db.tbl;

(5) Key columns should be a ordered prefix of the schema
建表时UNIQUE KEY必须放在所有字段前面声明且保证有序

5.DataX导入数据

我这里只是测试了使用阿里开源的DataX将SQL Server中的数据导入到starrocks中,遇到的问题,关于DataX的安装,可以查看 Post not found: 工具使用之数据同步 工具使用之数据同步 文章。

1.安装starrockswriter插件

将starrockswriter插件下载,并放到datax/plugin/writer目录下。

2.编写json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"job": {
"setting": {
"speed": {
"channel": 128
}
},
"content": [{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "xxx",
"password": "xxx",
"column": ["*"],
"connection": [{
"table": ["realtime"],
"jdbcUrl": ["jdbc:sqlserver://192.168.1.99:1433;databasename=phhlgypvc"]
}]
}
},
"writer": {
"name": "starrockswriter",
"parameter": {
"username": "xxx",
"password": "xxx",
"database": "phhlgypvc",
"table": "realtime",
"column": ["*"],
"preSql": [],
"postSql": [],
"jdbcUrl": "jdbc:mysql://192.168.1.95:9030/",
"loadUrl": ["192.168.1.95:8030"],
"loadProps": {}
}
}
}]
}
}
参考文章:
1.StarRocksWriter 插件
2.DataX doriswriter 这是starrocks同源的Apache Doris的writer。

3.执行导入

1
python /usr/local/datax/bin/datax.py /usr/local/datax/job/full_starrocks.json

4.运行成功

问题

(1) Request failed with code:401
在执行导入操作的时候,返回了401错误:Unable to flush data to StarRocks: unknown result status.

[解决]
这个问题主要是因为认证引起的,我使用了新创建的bibi帐号,虽然授予了权限,但是无法登录:http://192.168.1.95:8030/ 网站,所以就会导致了在执行:Executing stream load to: ‘http://192.168.1.95:8030/api/phhlgypvc/realtime/_stream_load',这一部分的内容的时候,出现了401 错误。

6.手动数据导入

1.insert into语句

小批量的数据导入,使用insert into语句不合适。如果你非要执行insert into语句,请查看参考文章5。

参考文章:
1.第3.1章:StarRocks数据导入–Insert into
2.StarRocks(三)数据导入与查询
3.StarRocks数据导入和查询 Broker Load 通过 Broker 进程访问并读取外部数据源,然后采用 MySQL 协议向 StarRocks 创建导入作业。Spark Load 通过外部的 Spark 资源实现对导入数据的预处理,提高 StarRocks 大数据量的导入性能并且节省 StarRocks 集群的计算资源。Stream Load是一种同步执行的导入方式。用户通过 HTTP 协议发送请求将本地文件或数据流导入到 StarRocks中,并等待系统返回导入的结果状态,从而判断导入是否成功。Routine Load(例行导入)提供了一种自动从指定数据源进行数据导入的功能。用户通过 MySQL 协议提交例行导入作业,生成一个常驻线程,不间断的从数据源(如 Kafka)中读取数据并导入到 StarRocks 中。类似 MySQL 中的 Insert 语句,StarRocks 提供 INSERT INTO tbl SELECT …; 的方式从 StarRocks 的表中读取数据并导入到另一张表。或者通过 INSERT INTO tbl VALUES(…); 插入单条数据。数据源有DataX/DTS、Kettle/Informatic、StarRocks本身。
4.导入
5.第3.1章:StarRocks数据导入–Insert into

2.Steam Load

所有的参数都放到请求的header中,数据放到请求的body里面。使用python3进行测试的时候,需要先安装 requests 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/python
# -*- coding: utf-8 -*-
"""
# Copyright (c) 2021 Beijing Dingshi Zongheng Technology Co., Ltd. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# See the License for the specific language governing permissions and
# limitations under the License.
"""


from requests import Session
import base64

class LoadSession(Session):
def rebuild_auth(self, prepared_request, response):
"""
No code here means requests will always preserve the Authorization
header when redirected.
"""


def main():
"""
Stream load Demo with Standard Lib requests
"""
username, password = '', ''
headers={
"Content-Type": "text/html; charset=UTF-8",
#"Content-Type": "application/octet-stream", # file upload
"connection": "keep-alive",
"max_filter_ratio": "0.2",
"columns": "k,v",
"column_separator": ',',
"Expect": "100-continue",
}
payload = '''1000,test1\n1001,test2\n1002,test3'''
database = 'd'
tablename = 'd'
api = 'http://192.168.1.95:8030/api/%s/%s/_stream_load' % (database, tablename)
session = LoadSession()
session.auth = (username, password)
response = session.put(url=api, headers=headers, data=payload)
#response = session.put(url=api, headers=headers, data= open("a.csv","rb")) # file upload
print(response.json())


if __name__ == '__main__':
main()
参考文章:
1.Stream Load
2.Stream load 官方的文档,还有事例。

3.Http

使用http的方式,就是使用的SteamLoad的方式,下面是导入一个csv文件

1
2
## 导入文件
curl --location-trusted -u test:123456 -T table1_data.csv -H "label: table1_20170707" -H "column_separator:," http://127.0.0.1:8030/api/example_db/table1/_stream_load

注意

(1) 在使用postman进行测试的时候,不能选择POST方式,要选择PUT方式进行提交数据,否在会返回:{“status”:”FAILED”,”msg”:”Not implemented”}。
(2) 请求头中要包括 Authorization,内容为 Basic 用户名密码的base64编码,比如我的用户名为 test,密码为 1234,则需要对 test:1234,进行编码,结果为 dGVzdDoxMjM0,那么 Authorization:dGVzdDoxMjM0,其他的属性,可以按照官网的要求进行填写。
(3) columns为列名
(4) label是一个唯一标志符,标明此次的提交记录。
(5) 请求地址:http://127.0.0.1:8030/api/数据库名/表名/_stream_load

1
2
3
4
5
6
7
8
Content-Type:text/html; charset=UTF-8
connection:keep-alive
max_filter_ratio:0.2
columns:SiteNo,RecordTime,Alarm
column_separator:,
Expect:100-continue
Authorization:Basic dGVzdDoxMjM0
label:39c25a5c-7000-496e-a98e-348a264c81de

请求体Body里面,可以选择类型为Text,按行分割要填入的数据

数据插入成功:

参考文章:
1.StarRocks数据导入和查询
2.StarRocks(三)数据导入与查询
3.HTTP基本认证 请求的HTTP头字段会包含Authorization字段,形式如下: Authorization: Basic <凭证>,该凭证是用户和密码的组和的base64编码。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。