国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(上)
概述背景Apache Doris官方地址Apache DorisApache Doris GitHub源码地址GitHub - apache/incubator-doris: Apache Doris(Incubating) is an MPP-based interactive SQL data warehousing for reporting and analysis.Apache Dori
概述
背景
Apache Doris GitHub源码地址 GitHub - apache/incubator-doris: Apache Doris(Incubating) is an MPP-based interactive SQL data warehousing for reporting and analysis.
- Apache Doris是一个现代化的MPP分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。
- Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。令您的数据分析工作更加简单高效!
- Doris 最早是解决百度凤巢统计报表的专用系统,随着百度业务的飞速发展对系统进行了多次迭代,逐渐承担起百度内部业务的统计报表和多维分析需求。2013 年,百度把 Doris 进行了 MPP 框架的升级,并将新系统命名为 Palo ,2017 年以百度 Palo 的名字在 GitHub 上进行了开源,2018 年贡献给 Apache 基金会时,由于与国外数据库厂商重名,因此选择用回最初的名字,这就是 Apache Doris 的由来。
- 之后在美团, 小米, 字节跳动, 京东等互联网企业被适用于核心业务实时数据分析。Apache Doris 与 Clickhouse 都是 MPP 数据库领域的优秀产品,各自擅长的领域或适用的场景存在差异,所有用户可以基于技术认知和业务需求来抉择到底该选择哪一款产品,甚至在大多场景里两者是可以并存和相互补足的。
- 2020 年 2 月,百度 Doris 团队的个别同学离职创业,基于 Apache Doris 之前的版本做了自己的商业化闭源产品 DorisDB ,这就是 StarRocks 的前身。DorisDB升级为StarRocks,并全面开源。
定义
StarRocks官网地址 StarRocks - 新一代极速全场景MPP数据库 目前最新版本为2.2.0
StarRocks官网文档地址 什么是 StarRocks @ StarRocks_intro @ StarRocks Docs
StarRocks GitHub源码地址 GitHub - StarRocks/starrocks: StarRocks is a next-gen sub-second MPP database for full analytics scenarios, including multi-dimensional analytics, real-time analytics and ad-hoc query.
- StarRocks是新一代极速全场景MPP数据库。
- StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化、升级架构,并增添了众多全新功能,形成了全新的企业级产品。
- StarRocks致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型、更新模型),多种导入方式(批量和实时),支持导入多达10000列的数据,可整合和接入多种现有系统(Spark、Flink、Hive、 ElasticSearch)。
- StarRocks兼容MySQL协议,可使用MySQL客户端和常用BI工具对接StarRocks来进行数据分析。
- StarRocks采用分布式架构,对数据表进行水平划分并以多副本存储。集群规模可以灵活伸缩,能够支持10PB级别的数据分析; 支持MPP框架,并行加速计算; 支持多副本,具有弹性容错能力。
- StarRocks采用关系模型,使用严格的数据类型和列式存储引擎,通过编码和压缩技术,降低读写放大;使用向量化执行方式,充分挖掘多核CPU的并行计算能力,从而显著提升查询性能。
发布路线
这个是StarRocks2021年前规划,现在最新版本已为2.2.0
特性
- 架构精简:StarRocks内部通过MPP计算框架完成SQL的具体执行工作。MPP框架本身能够充分的利用多节点的计算能力,整个查询并行执行,从而实现良好的交互式分析体验。 StarRocks集群不需要依赖任何其他组件,易部署、易维护,极简的架构设计,降低了StarRocks系统的复杂度和维护成本,同时也提升了系统的可靠性和扩展性。 管理员只需要专注于StarRocks系统,无需学习和管理任何其他外部系统。
- 全面向量化引擎:StarRocks的计算层全面采用了向量化技术,将所有算子、函数、扫描过滤和导入导出模块进行了系统性优化。通过列式的内存布局、适配CPU的SIMD指令集等手段,充分发挥了现代CPU的并行计算能力,从而实现亚秒级别的多维分析能力。
- 智能查询优化:StarRocks通过CBO优化器(Cost Based Optimizer)可以对复杂查询自动优化。无需人工干预,就可以通过统计信息合理估算执行成本,生成更优的执行计划,大大提高了Adhoc和ETL场景的数据分析效率。
- 联邦查询:StarRocks支持使用外表的方式进行联邦查询,当前可以支持Hive、MySQL、Elasticsearch三种类型的外表,用户无需通过数据导入,可以直接进行数据查询加速。
- 高效更新:StarRocks支持多种数据模型,其中更新模型可以按照主键进行upsert/delete操作,通过存储和索引的优化可以在并发更新的同时实现高效的查询优化,更好的服务实时数仓的场景。
- 智能物化视图:StarRocks支持智能的物化视图。用户可以通过创建物化视图,预先计算生成预聚合表用于加速聚合类查询请求。StarRocks的物化视图能够在数据导入时自动完成汇聚,与原始表数据保持一致。并且在查询的时候,用户无需指定物化视图,StarRocks能够自动选择最优的物化视图来满足查询请求。
- 标准SQL:StarRocks支持标准的SQL语法,包括聚合、JOIN、排序、窗口函数和自定义函数等功能。StarRocks可以完整支持TPC-H的22个SQL和TPC-DS的99个SQL。此外,StarRocks还兼容MySQL协议语法,可使用现有的各种客户端工具、BI软件访问StarRocks,对StarRocks中的数据进行拖拽式分析。
- 流批一体:StarRocks支持实时和批量两种数据导入方式,支持的数据源有Kafka、HDFS、本地文件,支持的数据格式有ORC、Parquet和CSV等,支持导入多达10000列的数据。StarRocks可以实时消费Kafka数据来完成数据导入,保证数据不丢不重(exactly once)。StarRocks也可以从本地或者远程(HDFS)批量导入数据。
- 高可用易扩展:StarRocks的元数据和数据都是多副本存储,并且集群中服务有热备,多实例部署,避免了单点故障。集群具有自愈能力,可弹性恢复,节点的宕机、下线、异常都不会影响StarRocks集群服务的整体稳定性。 StarRocks采用分布式架构,存储容量和计算能力可近乎线性水平扩展。StarRocks单集群的节点规模可扩展到数百节点,数据规模可达到10PB级别。 扩缩容期间无需停服,可以正常提供查询服务。 另外StarRocks中表模式热变更,可通过一条简单SQL命令动态地修改表的定义,例如增加列、减少列、新建物化视图等。同时,处于模式变更中的表也可也正常导入和查询数据。
使用场景
StarRocks可以满足企业级用户的多种分析需求,包括OLAP多维分析、定制报表、实时数据分析和Ad-hoc数据分析等。具体的业务场景包括:
- OLAP多维分析
- 用户行为分析
- 用户画像、标签分析、圈人
- 高维业务指标报表
- 自助式报表平台
- 业务问题探查分析
- 跨主题业务分析
- 财务报表
- 系统监控分析
- 实时数据分析
- 电商大促数据分析
- 教育行业的直播质量分析
- 物流行业的运单分析
- 金融行业绩效分析、指标计算
- 广告投放分析
- 管理驾驶舱
- 探针分析APM(Application Performance Management)
- 高并发查询
- 广告主报表分析
- 零售行业渠道人员分析
- SaaS行业面向用户分析报表
- Dashbroad多页面分析
- 统一分析
- 通过使用一套系统解决多维分析、高并发查询、预计算、实时分析、Adhoc查询等场景,降低系统复杂度和多技术栈开发与维护成本。
与其他分析层数仓框架对比,其极速统一架构如下
与Flink生态对接
基本概念和架构
系统架构图
组件介绍
StarRocks 集群由 FE 和 BE 构成, 可以使用 MySQL 客户端访问 StarRocks 集群。
FrontEnd
简称 FE,是 StarRocks 的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。FE 接收 MySQL 客户端的连接, 解析并执行 SQL 语句。
- 管理元数据, 执行 SQL DDL 命令, 用 Catalog 记录库, 表,分区,tablet 副本等信息。
- FE 的 SQL layer 对用户提交的 SQL 进行解析,分析, 改写, 语义分析和关系代数优化, 生产逻辑执行计划。
- FE 的 Planner 负责把逻辑计划转化为可分布式执行的物理计划,分发给一组 BE。
- FE 监督 BE,管理 BE 的上下线, 根据 BE 的存活和健康状态, 维持 tablet 的副本的数量。
- FE 协调数据导入, 保证数据导入的一致性。
- FE 高可用部署,使用复制协议选主和主从同步元数据, 所有的元数据修改操作,由 FE leader 节点完成, FE follower 节点可执行读操作。 元数据的读写满足顺序一致性。FE 的节点数目采用 2n+1,可容忍 n 个节点故障。当 FE leader 故障时,从现有的 follower 节点重新选主,完成故障切换。
BackEnd
简称 BE,是 StarRocks 的后端节点,负责数据存储,计算执行,以及 compaction,副本管理等工作。
- BE 管理 tablet 的副本。
- BE 受 FE 指导, 创建或删除 tablet。
- BE 接收 FE 分发的物理执行计划并指定 BE coordinator 节点,在 BE coordinator 的调度下,与其他 BE worker 共同协作完成执行。
- BE 读本地的列存储引擎获取数据, 并通过索引和谓词下沉快速过滤数据。
- BE 后台执行 compact 任务,减少查询时的读放大。
- 数据导入时, 由 FE 指定 BE coordinator, 将数据以 fanout 的形式写入到 tablet 多副本所在的 BE 上。
其他组件
Broker
Broker 是 StarRocks 和 HDFS 对象存储等外部数据对接的中转服务,辅助提供导入导出功能,如需使用 broker load,spark load,备份恢复等功能需要安装启动 Broker。
- Hdfs Broker: 用于从 Hdfs 中导入数据到 StarRocks 集群,详见 数据导入 章节。
StarRocksManager
StarRocksManager 是 StarRocks 企业版提供的管理工具,通过 Manager 可以可视化的进行 StarRocks 集群管理、在线查询、故障查询、监控报警、可视化慢查询分析等功能。
手动部署
环境支持
集群节点需要以下环境支持:
- Linux (Centos 7+)
- 推荐 Oracle Java 1.8+
- CPU 需要支持 AVX2 指令集
- ulimit -n 配置 65535,启动脚本会自动设置,需要启动的用户有设置 ulimit -n 权限
- 集群时钟需同步
- 网络需要万兆网卡和万兆交换机
通过 cat /proc/cpuinfo |grep avx2
命令查看节点配置,有结果则 cpu 支持 AVX2 指令集。
测试集群建议节点配置:BE 推荐 16 核 64GB 以上,FE 推荐 8 核 16GB 以上。建议 FE,BE 独立部署。
系统参数配置建议:
关闭交换区,消除交换内存到虚拟内存时对性能的扰动。
echo 0 | sudo tee /proc/sys/vm/swappiness
建议使用 Overcommit,把 cat /proc/sys/vm/overcommit_memory 设成 1。
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
部署
部署规划
下载
# 从官网下载
wget https://www.starrocks.com/zh-CN/download/request-download/22/StarRocks-2.2.0-rc01.tar.gz
# 下载的安装包可直接解压后进行安装部署
tar -xvf StarRocks-2.2.0-rc02.tar.gz
查看FE目录结构
查看BE目录结构
部署FE
- FE 的基本配置
- FE 的配置文件为 fe/conf/fe.conf, 此处仅列出其中 JVM 配置和元数据目录配置,生产环境可参考 FE 参数配置 对集群进行详细优化配置。
cd StarRocks-2.2.0-rc02/fe
# 第一步: 配置文件 conf/fe.conf
vi conf/fe.conf
# 元数据目录
meta_dir = ${STARROCKS_HOME}/meta
# JVM配置
JAVA_OPTS = "-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:$STARROCKS_HOME/log/fe.gc.log"
# 由于我本机有很多网卡,通信网段为192.168.0.0,因此配置如下
priority_networks = 10.10.10.0/24;192.168.0.0/16
可以根据 FE 内存大小调整-Xmx8192m,为了避免 GC 建议 16G 以上,StarRocks 的元数据都在内存中保存。
# 第二步: 创建元数据目录,需要与 fe.conf 中配置路径保持一致:
mkdir -p meta
# 第三步: 启动 FE 进程:
bin/start_fe.sh --daemon
# 第四步: 确认启动 FE 启动成功。
- 查看日志 log/fe.log 确认。
- 如果 FE 启动失败,可能是由于端口号被占用,可修改配置文件 conf/fe.conf 中的端口号 http_port。
- 使用 jps 命令查看 java 进程确认 "StarRocksFe" 存在。
- 使用浏览器访问
FE ip:http_port
(默认 8030),打开 StarRocks 的 WebUI, 用户名为 root, 密码为空。
访问 StarRocks 的 WebUI,http://192.168.5.52:8030
使用 MySQL 客户端访问 FE,这里默认 root 用户密码为空,端口为 fe/conf/fe.conf 中的 query_port 配置项,默认为 9030,查看 FE 状态是正常
通过SQLyog的第三方MySQL客户端连接和查询结果
部署BE
BE 的基本配置:BE 的配置文件为 be/conf/be.conf,默认配置即可启动集群,生产环境可参考 BE 参数配置对集群进行详细优化配置。
BE 部署:通过以下命令启动 be 并添加 be 到 StarRocks 集群, 一般至少在三个节点部署 3 个 BE 实例, 每个实例的添加步骤相同。
# 进入be的安装目录
cd StarRocks-2.2.0-rc02/be
# 第一步: 创建数据目录(当前设置为 be.conf 中默认 storage_root_path 配置项路径):
# 创建数据存储目录
mkdir -p storage
# 第二步: 通过 mysql 客户端添加 BE 节点:host 为与 priority_networks 设置相匹配的 IP,port 为 BE 配置文件中的 heartbeat_service_port,默认为 9050。
mysql> ALTER SYSTEM ADD BACKEND "192.168.5.52:9050";
如出现错误,需要删除 BE 节点,可通过以下命令将 BE 节点从集群移除,host 和 port 与添加时一致:具体参考 扩容缩容。
mysql> ALTER SYSTEM decommission BACKEND "host:port";
# 第三步: 启动 BE:
bin/start_be.sh --daemon
# 第四步: 查看 BE 状态, 确认 BE 就绪:
显示isAlive 为 true,则说明 BE 正常接入集群。如果 BE 没有正常接入集群,请查看 log 目录下的 be.WARNING 日志文件确定原因。
如果日志中出现类似"backend ip saved in master does not equal to backend local ip127.0.0.1 vs. 192.168.5.22"的信息,说明 priority_networks 的配置存在问题。此时需要,先用以下命令 drop 掉原来加进去的 be,然后重新以正确的 IP 添加 BE。
mysql> ALTER SYSTEM DROPP BACKEND "192.168.5.22:9050";
由于是初次启动,如果在操作过程中遇到任何意外问题,都可以删除并重新创建 storage 目录,再从头开始操作。
其他两台是相同部署方式,由于192.168.12.28上8040和8060端口已经被占用,所以配置文件的端口信息
启动192.168.12.28的BE,查看
启动192.168.5.52的BE,查看
部署Broker
配置文件为 apache_hdfs_broker/conf/apache_hdfs_broker.conf
注意:Broker 没有也不需要 priority_networks 参数,Broker 的服务默认绑定在 0.0.0.0 上,只需要在 ADD BROKER 时,填写正确可访问的 Broker IP 即可。
如果有特殊的 hdfs 配置,复制线上的 hdfs-site.xml 到 conf 目录下
启动 broker:
cd StarRocks-2.2.0-rc02/apache_hdfs_broker
bin/start_broker.sh --daemon
添加 broker 节点到集群中,查看 broker 状态:
mysql> 查看 broker 状态:
继续部署其他两个broker,三个broker的状态都是正常
实战使用
表创建示例
# 使用 root 用户建立 example_db 数据库
mysql> create database example_db;
# 通过 `show databases;` 查看数据库信息:
mysql> show databases;
通过官方提供建表脚本创建表
CREATE TABLE IF NOT EXISTS detailDemo (
make_time DATE NOT NULL COMMENT "YYYY-MM-DD",
mache_verson TINYINT COMMENT "range [-128, 127]",
mache_num SMALLINT COMMENT "range [-32768, 32767] ",
de_code INT COMMENT "range [-2147483648, 2147483647]",
saler_id BIGINT COMMENT "range [-2^63 + 1 ~ 2^63 - 1]",
pd_num LARGEINT COMMENT "range [-2^127 + 1 ~ 2^127 - 1]",
pd_type CHAR(20) NOT NULL COMMENT "range char(m),m in (1-255) ",
pd_desc VARCHAR(500) NOT NULL COMMENT "upper limit value 65533 bytes",
us_detail STRING NOT NULL COMMENT "upper limit value 65533 bytes",
relTime 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(make_time, mache_verson)
PARTITION BY RANGE (make_time) (
START ("2022-03-11") END ("2022-03-15") EVERY (INTERVAL 1 day)
)
DISTRIBUTED BY HASH(make_time, mache_verson) BUCKETS 8
PROPERTIES(
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8"
);
# 命令查看当前库的所有表
mysql> show tables;
# 查看表结构
mysql> desc detailDemo;
# 查看建表语句,在 StarRocks 中字段名不区分大小写,表名区分大小写
mysql> show create table detailDemo;
建表语句说明
-
排序键
- StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key),明细模型中由
DUPLICATE KEY
指定排序列,以上 demo 中的make_time, mache_verson
两列为排序列。注意排序列在建表时应定义在其他列之前。排序键详细描述以及不同数据模型的表的设置方法请参考 排序键。
- StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key),明细模型中由
-
字段类型
-
分区,分桶
PARTITION
关键字用于给表 [创建分区](https://docs.starrocks.com/zh-cn/main/sql-reference/sql-statements/data-definition/CREATE TABLE#Syntax),当前 demo 中使用make_time
进行范围分区,从 11 日到 15 日每天创建一个分区。StarRocks 支持动态生成分区,PROPERTIES
中的dynamic_partition
开头的相关属性配置都是为表设置动态分区。详见 动态分区管理。DISTRIBUTED
关键字用于给表 [创建分桶](https://docs.starrocks.com/zh-cn/main/sql-reference/sql-statements/data-definition/CREATE TABLE#Syntax),当前 demo 中使用make_time, mache_verson
两个字段通过 Hash 算法创建 32 个桶。- 创建表时合理的分区和分桶设计可以优化表的查询性能,分区分桶列如何选择详见 数据分布章节。
-
数据模型
-
索引
- StarRocks 默认会给 Key 列创建稀疏索引加速查询,具体规则见 排序键和 shortke index 章节。支持的索引类型有 Bitmap 索引,Bloomfilter 索引 等。
注意:索引创建对表模型和列有要求,详细说明见对应索引介绍章节。
- ENGINE 类型
- 默认为 olap。可选 mysql,elasticsearch,hive,ICEBERG 代表创建表为 外部表。
更多推荐
所有评论(0)