部署StarRocks V3.0单机环境
环境申请
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | docker rm -f starrocks300 docker run -itd --name starrocks300 -h starrocks300 \ -p 9031:9030 -p 8031:8030 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:9.2 \ /usr/sbin/init wget https://releases.mirrorship.cn/starrocks/StarRocks-3.0.0.tar.gz docker cp -q StarRocks-3.0.0.tar.gz starrocks300:/soft/ docker exec -it starrocks300 bash tar -zxf /soft/StarRocks-3.0.0.tar.gz -C /usr/local/ ln -s /usr/local/StarRocks-3.0.0 /usr/local/starrocks mkdir -p /usr/local/starrocks/fe/meta mkdir -p /usr/local/starrocks/be/storage chown root.root -R /usr/local/starrocks/ chown root.root -R /usr/local/StarRocks-3.0.0/ |
安装包下载: https://www.mirrorship.cn/zh-CN/download/community
配置操作系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | echo 0 | sudo tee /proc/sys/vm/swappiness echo 1 | sudo tee /proc/sys/vm/overcommit_memory sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config setenforce 0 cat >> /etc/security/limits.conf <<"EOF" * soft nofile 65535 * hard nofile 65535 EOF ulimit -HSn 65535 cat >> /etc/sysctl.conf <<"EOF" vm.overcommit_memory=1 vm.swappiness=0 EOF sysctl -p |
环境变量配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- 至少需要Java jdk 1.8 yum -y install java-1.8.0-openjdk-devel.x86_64 java -version cat >> /root/.bashrc <<"EOF" export STARROCKS_HOME=/usr/local/starrocks export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin:$STARROCKS_HOME/fe/bin:$STARROCKS_HOME/be/bin:$STARROCKS_HOME/apache_hdfs_broker/bin EOF source /root/.bashrc |
配置FE节点
配置FE节点
注意:当一台机器拥有多个 IP 地址时,需要在 FE 配置文件 conf/fe.conf 中设置 priority_networks,为该节点设定唯一 IP。
在${STARROCKS_HOME}/fe/conf/fe.conf
文件中配置如下内容:
1 2 3 4 5 6 7 8 9 10 11 | # 修改元数据目录。 meta_dir = /opt/software/StarRocks-2.2.2/meta # 修改配置,网段,自动发现IP priority_networks = 192.168.0.0/24 # 添加 Java 目录 JAVA_HOME = /opt/software/jdk1.8.0_212 # 修改JVM内存,默认是8G,根据自己机器自定义,默认是-Xmx8192m,这里我修改成Xmx512m,这里有两段配置,jdk 9+使用JAVA_OPTS_FOR_JDK_9 JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx512m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$STARROCKS_HOME/log/fe.gc.log.$DATE" # For jdk 9+, this JAVA_OPTS will be used as default JVM options JAVA_OPTS_FOR_JDK_9="-Dlog4j2.formatMsgNoLookups=true -Xmx512m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$STARROCKS_HOME/log/fe.gc.log.$DATE:time" |
如需在生产环境中对集群进行详细优化配置,参考 FE 参数配置。
我这里因为是单节点,所以只配置本地地址:
1 | echo "priority_networks = 127.0.0.1/32" >> ${STARROCKS_HOME}/fe/conf/fe.conf |
启动FE节点
运行以下命令启动 FE 节点。
1 | /usr/local/starrocks/fe/bin/start_fe.sh --daemon |
如果由于端口被占用导致 FE 启动失败,可修改配置文件 fe/conf/fe.conf
中的端口号 http_port
。
检查FE节点
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 | tail -f ${STARROCKS_HOME}/fe/log/fe.log ps -ef|grep java jps netstat -tulnp | grep java -- 日志输出: 2020-03-16 20:32:14,686 INFO 1 [FeServer.start():46] thrift server started. // FE 节点启动成功。 2020-03-16 20:32:14,696 INFO 1 [NMysqlServer.start():71] Open mysql server success on 9030 // 可以使用 MySQL 客户端通过 `9030` 端口连接 FE。 2020-03-16 20:32:14,696 INFO 1 [QeService.start():60] QE service start. 2020-03-16 20:32:14,825 INFO 76 [HttpServer$HttpServerThread.run():210] HttpServer started with port 8030 ... [root@starrocks300 ~]# jps 8280 StarRocksFE 8714 Jps [root@starrocks300 ~]# netstat -tulnp | grep java tcp 0 0 172.71.0.40:9010 0.0.0.0:* LISTEN 8280/java tcp 0 0 0.0.0.0:9020 0.0.0.0:* LISTEN 8280/java tcp 0 0 0.0.0.0:8030 0.0.0.0:* LISTEN 8280/java tcp 0 0 0.0.0.0:9030 0.0.0.0:* LISTEN 8280/java [root@starrocks300 ~]# [root@starrocks300 ~]# ps -ef|grep java root 8280 0 5 10:49 pts/1 00:00:16 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/bin/java -Dlog4j2.formatMsgNoLookups=true -Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:/usr/local/starrocks/fe/log/fe.gc.log.20230329-104953 -XX:+PrintConcurrentLocks com.starrocks.StarRocksFE root 8761 210 0 10:55 pts/1 00:00:00 grep --color=auto java [root@starrocks300 ~]# |
通过运行 jps
命令查看 Java 进程,确认 StarRocksFE 进程是否存在。
通过mysql客户端查看节点信息
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 | yum -y install mysql # 用户名为 root,密码为空 mysql -h 127.0.0.1 -P9030 -uroot # 查看 FE 状态。 SHOW PROC '/frontends'\G [root@starrocks300 ~]# mysql -h 127.0.0.1 -P9030 -uroot Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 0 Server version: 5.1.0 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show frontends \G *************************** 1. row *************************** Name: 127.0.0.1_9010_1680064832570 IP: 127.0.0.1 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: LEADER ClusterId: 1723834094 Join: true Alive: true ReplayedJournalId: 72 LastHeartbeat: 2023-03-29 12:46:20 IsHelper: true ErrMsg: StartTime: 2023-03-29 12:46:02 Version: 3.0.0-46bf084 1 row in set (0.02 sec) MySQL [(none)]> |
- 当 Role 为 LEADER 时,当前 FE 节点为选举出的主节点。
- 当 Role 为 FOLLOWER 时,当前节点是一个能参与选主的 FE 节点。
如果 MySQL 客户端连接失败,可以通过查看 log/fe.warn.log 日志文件发现问题。
如果在初次部署时遇到任何意外问题,可以在删除并重新创建 FE 的元数据目录后,重新开始部署。
通过在浏览器访问 FE ip:http_port
(默认 http_port
为 8030
),进入 StarRocks 的 WebUI,用户名为 root
,密码为空。
配置BE节点
配置部署 Backend (BE) 节点。
BE 是 StarRocks 的后端节点,负责数据存储以及 SQL 执行等工作。
以下例子仅部署一个 BE 节点。您可以通过重复以下步骤添加多个 BE 节点。
添加BE节点
【温馨提示】
1、FE节点之间的时钟相差不能超过5s, 使用NTP协议校准时间。一台机器上只可以部署单个FE节点。所有FE节点的http_port需要相同。
2、
host
需要与priority_networks
相匹配,port
需要与 be.conf 文件中的设置的heartbeat_service_port
相同,默认为9050
。
1 2 3 4 5 | echo "priority_networks = 127.0.0.1/32" >> ${STARROCKS_HOME}/be/conf/be.conf mysql -h 127.0.0.1 -P9030 -uroot ALTER SYSTEM ADD BACKEND "127.0.0.1:9050"; |
如添加过程出现错误,需要通过以下命令将该 BE 节点从集群移除。
1 | mysql> ALTER SYSTEM decommission BACKEND "127.0.0.1:9050"; |
启动BE节点
1 | /usr/local/starrocks/be/bin/start_be.sh --daemon |
检查BE节点
1 2 3 | tail -f ${STARROCKS_HOME}/be/log/be.out ps -ef|grep starrocks netstat -tulnp | grep starrocks |
示例:
1 2 3 4 5 6 7 8 9 | [root@PT-Test-13 log]# netstat -tulnp | grep starrocks tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 18989/starrocks_be tcp 0 0 0.0.0.0:8040 0.0.0.0:* LISTEN 18989/starrocks_be tcp6 0 0 :::9050 :::* LISTEN 18989/starrocks_be tcp6 0 0 :::9060 :::* LISTEN 18989/starrocks_be [root@PT-Test-13 log]# ps -ef|grep starrocks root 7911 11528 0 16:28 pts/0 00:00:00 grep --color=auto starrocks root 18989 1 1 15:37 pts/0 00:00:44 /usr/local/starrocks/be/lib/starrocks_be [root@PT-Test-13 log]# |
确认BE启动成功
通过 MySQL 客户端确认 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 28 29 30 31 32 33 34 35 36 37 38 39 | [root@starrocks300 conf]# mysql -h 127.0.0.1 -P9030 -uroot Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.0 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show backends \G *************************** 1. row *************************** BackendId: 11001 IP: 127.0.0.1 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2023-03-29 12:48:21 LastHeartbeat: 2023-03-29 12:48:26 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 0 DataUsedCapacity: 0.000 AvailCapacity: 519.352 GB TotalCapacity: 1019.104 GB UsedPct: 49.04 % MaxDiskUsedPct: 49.04 % ErrMsg: Version: 3.0.0-46bf084 Status: {"lastSuccessReportTabletsTime":"2023-03-29 12:48:21"} DataTotalCapacity: 519.352 GB DataUsedPct: 0.00 % CpuCores: 16 NumRunningQueries: 0 MemUsedPct: 0.24 % CpuUsedPct: 0.1 % 1 row in set (0.01 sec) |
当 Alive
为 true
时,当前 BE 节点正常接入集群。
如果 BE 节点没有正常接入集群,可以通过查看 log/be.WARNING 日志文件排查问题。
如果日志中出现类似以下的信息,说明 priority_networks
的配置存在问题。
1 | W0708 17:16:27.308156 11473 heartbeat_server.cpp:82\] backend ip saved in master does not equal to backend local ip127.0.0.1 vs. 172.16.xxx.xx |
如遇到以上问题,可以通过 DROP 错误的 BE 节点,然后重新以正确的 IP 添加 BE 节点的方式来解决。
1 | ALTER SYSTEM DROP BACKEND "172.16.xxx.xx:9050"; |
如果在初次部署时遇到任何意外问题,可以在删除并重新创建 BE 的数据路径后,重新开始部署。
成功部署 StarRocks 集群后,您可以:
部署Broker节点
通过 Broker,StarRocks 可读取对应数据源(如HDFS、S3)上的数据,利用自身的计算资源对数据进行预处理和导入。除此之外,Broker 也被应用于数据导出,备份恢复等功能。
通过以下命令启动 Broker。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /usr/local/starrocks/apache_hdfs_broker/bin/start_broker.sh --daemon ps -ef|grep broker netstat -tulnp | grep 8000 mysql -h 127.0.0.1 -P9030 -uroot ALTER SYSTEM ADD BROKER broker_name "127.0.0.1:8000"; show broker; MySQL [(none)]> show broker; +-------------+-----------+------+-------+---------------------+---------------------+--------+ | Name | IP | Port | Alive | LastStartTime | LastUpdateTime | ErrMsg | +-------------+-----------+------+-------+---------------------+---------------------+--------+ | broker_name | 127.0.0.1 | 8000 | true | 2023-03-30 09:32:54 | 2023-03-30 09:32:54 | | +-------------+-----------+------+-------+---------------------+---------------------+--------+ 1 row in set (0.00 sec) |
当 Alive
为 true
时,当前 Broker 节点正常接入集群。
创建数据库
使用 root
用户创建 example_db
数据库。
注意
在指定数据库名、表名和列名等变量时,如果使用了保留关键字,必须使用反引号 (`) 包裹,否则可能会产生报错。有关 StarRocks 的保留关键字列表,请参见关键字。
1 | CREATE DATABASE example_db; |
您可以通过 SHOW DATABASES;
命令查看当前 StarRocks 集群中所有数据库。
1 2 3 4 5 6 7 8 9 10 | MySQL [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | _statistics_ | | example_db | | information_schema | +--------------------+ 3 rows in set (0.00 sec) |
说明:与 MySQL 的表结构类似,
information_schema
包含当前 StarRocks 集群的元数据信息,但是部分统计信息还不完善。推荐您通过DESC table_name
等命令来获取数据库元数据信息。
创建表
在新建的数据库中创建表。
StarRocks 支持 多种数据模型,以适用不同的应用场景。以下示例基于 明细表模型 编写建表语句。
更多建表语法,参考 [CREATE TABLE](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/data-definition/CREATE TABLE) 。
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 | 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 1048576 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`) PARTITION BY RANGE(`recruit_date`) ( PARTITION p20220311 VALUES [('2022-03-11'), ('2022-03-12')), PARTITION p20220312 VALUES [('2022-03-12'), ('2022-03-13')), PARTITION p20220313 VALUES [('2022-03-13'), ('2022-03-14')), PARTITION p20220314 VALUES [('2022-03-14'), ('2022-03-15')), PARTITION p20220315 VALUES [('2022-03-15'), ('2022-03-16')) ) DISTRIBUTED BY HASH(`recruit_date`, `region_num`) BUCKETS 8 PROPERTIES ( "replication_num" = "1" ); |
注意
- 在 StarRocks 中,字段名不区分大小写,表名区分大小写。
- 建表时,
DISTRIBUTED BY
为必填字段。
建表语句说明
排序键
StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key)。明细模型中由 DUPLICATE KEY
指定排序列。以上示例中的 recruit_date
以及 region_num
两列为排序列。
注意:排序列在建表时应定义在其他列之前。排序键详细描述以及不同数据模型的表的设置方法请参考 排序键。
字段类型
StarRocks 表中支持多种字段类型,除以上示例中已经列举的字段类型,还支持 BITMAP 类型,HLL 类型,ARRAY 类型,字段类型介绍详见 数据类型章节。
注意:在建表时,您应尽量使用精确的类型。例如,整形数据不应使用字符串类型,INT 类型即可满足的数据不应使用 BIGINT 类型。精确的数据类型能够更好的发挥数据库的性能。
分区分桶
PARTITION
关键字用于给表 [创建分区](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/data-definition/CREATE TABLE#partition_desc)。以上示例中使用 recruit_date
进行范围分区,从 11 日到 15 日每天创建一个分区。StarRocks 支持动态生成分区,详见 动态分区管理。为了优化生产环境的查询性能,我们强烈建议您为表制定合理的数据分区计划。
DISTRIBUTED
关键字用于给表 [创建分桶](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/data-definition/CREATE TABLE#distribution_desc),以上示例中使用 recruit_date
以及 region_num
两个字段通过 Hash 算法创建 8 个桶。
创建表时合理的分区和分桶设计可以优化表的查询性能。有关分区分桶列如何选择,详见 数据分布。
数据模型
DUPLICATE
关键字表示当前表为明细模型,KEY
中的列表示当前表的排序列。StarRocks 支持多种数据模型,分别为 明细模型,聚合模型,更新模型,主键模型。不同模型的适用于多种业务场景,合理选择可优化查询效率。
索引
StarRocks 默认会给 Key 列创建稀疏索引加速查询,具体规则见 排序键。支持的索引类型有 Bitmap 索引,Bloomfilter 索引 等。
注意:索引创建对表模型和列有要求,详细说明见对应索引介绍章节。
ENGINE 类型
默认 ENGINE 类型为 olap
,对应 StarRocks 集群内部表。其他可选项包括 mysql
,elasticsearch
,hive
,jdbc
(2.3 及以后),hudi
(2.2 及以后)以及 iceberg
,分别代表所创建的表为相应类型的 外部表。
查看表信息
您可以通过 SQL 命令查看表的相关信息。
- 查看当前数据库中所有的表
1 | SHOW TABLES; |
- 查看表的结构
1 | DESC table_name; |
示例:
1 | DESC detailDemo; |
- 查看建表语句
1 | SHOW CREATE TABLE table_name; |