Apache Doris
开源、实时数据仓库
Apache Doris是一个用于实时分析的现代数据仓库。
它提供大规模闪电般的实时数据分析。
- 实时获取和存储
在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新,追加和预聚合的存储引擎 - 闪电般的查询
使用列式存储引擎、MPP架构、基于成本的查询优化器、矢量化执行引擎对高并发和高吞吐量查询进行优化。 - 联合查询
支持Hive、Iceberg、Hudi等数据湖和MySQL、PostgreSQL等数据库的联合查询。 - 半结构化数据
复合数据类型,如Array、Map和JSON。可变数据类型,支持JSON数据的自动数据类型推断。文本搜索的NGram bloomfilter和倒排索引。 - 弹性结构
线性可扩展性的分布式设计。工作负载隔离和分级存储,实现高效的资源管理。支持无共享集群以及存储和计算分离。 - 开放生态系统
兼容MySQL协议和ANSI SQL,轻松集成BI工具。提供开放数据API,供Spark、Flink和ML/AI等外部计算引擎访问。
1、什么是Apache Doris
Apache Doris是一个基于MPP的实时数据仓库,以其高查询速度而闻名。对于大型数据集的查询,它在次秒级返回结果。它支持高并发点查询和高吞吐量复杂分析。它可用于报表分析、临时查询、统一数据仓库和数据湖查询加速。基于Apache Doris,用户可以构建用户行为分析、A/B测试平台、日志分析、用户档案分析、电子商务订单分析等应用。
Apache Doris,原名Palo,最初是为了支持百度的广告报告业务而创建的。2017年正式开源,2018年7月由百度捐赠给Apache软件基金会,由孵化器项目管理委员会成员在Apache导师的指导下运营。2022年6月,Apache Doris从Apache孵化器毕业,成为顶级项目。到2024年,Apache Doris社区已经聚集了来自不同行业数百家公司的600多名贡献者,每月活跃贡献者超过120人。
Apache Doris拥有广泛的用户基础。它已在全球4000多家公司的生产环境中使用,包括抖音、百度、思科、腾讯和网易等巨头。它也被广泛应用于金融、零售、电信、能源、制造、医疗等行业。
1.1 使用场景
下图显示了Apache Doris在数据管道中可以做什么。数据源经过集成和处理后,被摄取到Apache Doris实时数据仓库和Hive、Iceberg、Hudi等离线数据湖中。Apache Doris可以用于以下目的:
- 报告分析
- 实时仪表盘
- 为内部分析和管理提供报告
- 面向客户的报告:如网站所有者的网站分析和广告商的广告报告。这种情况通常需要高并发性(数千QPS)和低查询延迟(以毫秒计)。例如,电子商务巨头京东使用Apache Doris进行广告报告。它每天摄取100亿行数据,并实现超过10,000 QPS和150ms的P99延迟。
- 特别查询:具有不规则查询模式和高吞吐量需求的面向分析人员的自助分析。例如,小米基于Doris构建了一个Growth Analytics平台。它每天处理10,000次SQL查询,平均查询延迟为10秒,P95延迟为30秒。
- 数据湖分析:Apache Doris允许对离线数据湖(如Hive、Hudi和Iceberg)中的外部表进行联邦查询,并通过避免数据复制实现出色的查询性能。
- 日志分析:Apache Doris从2.0版开始就支持反向索引和全文搜索。依靠其高效的查询和存储引擎,Apache Doris的成本效益比普通日志分析解决方案高10倍。
- 统一数据仓库:Apache Doris可以作为各种分析工作负载的统一数据处理平台,将用户从处理复杂的数据组件和技术堆栈中节省出来。例如,世界知名连锁餐厅海底捞,将原有的Spark、Hive、Kudu、HBase、Phoenix架构替换为Apache Doris。
1.2 技术概述
Apache Doris有一个简单而整洁的体系结构,只有两种类型的进程。
- 前端(Frontend,FE):用户请求处理、查询解析和规划、元数据管理和节点管理
- 后端(Backend,BE):数据存储和查询执行
前端和后端进程都是可扩展的,在单个集群中支持多达数百台机器和数十pb的存储容量。这两种进程都通过一致性协议保证了业务的高可用性和数据的高可靠性。这种高度集成的架构设计大大降低了分布式系统的运维成本。
1.3 接口
Apache Doris采用MySQL协议,支持标准SQL,与MySQL语法高度兼容。用户可以通过各种客户端工具访问Doris,并与包括但不限于SmartBI、DataEase、FineBI、Tableau、Power BI、SuperSet等BI工具无缝集成。它可以作为任何支持MySQL协议的BI工具的数据源。
1.4 存储引擎
Apache Doris有一个列存储引擎,它按列编码、压缩和读取数据。这可以实现非常高的数据压缩比,并大大减少不必要的数据扫描,从而更有效地利用IO和CPU资源。
Doris支持各种索引结构
,以最大限度地减少数据扫描:
- 排序复合键索引(Sorted Compound Key Index):用户最多可以指定三列,形成一个复合排序键。这可以有效地修剪数据,以更好地支持高度并发的报告场景。
- 最小/最大索引(MIN/MAX Indexing):这可以在数值类型的等价和范围查询中实现有效的数据过滤。
- Bloom Filter:这在高基数列的等价过滤和修剪中非常有效。
- 倒排索引:这允许快速搜索任何字段。
Doris支持多种数据模型
,并针对不同的场景进行了优化:
- 聚合键模型(Aggregate Key Model):将具有相同键的值列合并,通过预聚合提高性能
- 唯一键模式(Unique Key Model):保证键的唯一性,用相同的键覆盖数据,实现行级数据更新
- Duplicate Key Model:按原样存储数据,不进行聚合,能够详细存储事实表
Doris 也支持强一致性的物化视图(strongly consistent materialized views)。物化视图在系统内自动选择和更新,无需人工操作,从而降低了用户的维护成本。
1.5 查询引擎
Doris有一个基于MPP的查询引擎,用于节点之间和节点内部的并行执行。它支持大型表的分布式shuffle连接,以更好地处理复杂的查询。
Doris 查询引擎是向量化的查询引擎,所有的内存结构能够按照列式布局,这可以在很大程度上减少虚拟函数调用,提高缓存命中率,并有效地使用SIMD指令。在宽表聚合场景中,Doris的性能比非矢量化引擎高5~10倍。
Doris使用自适应查询执行技术(adaptive query execution ),根据运行时统计信息动态调整执行计划。例如,它可以生成一个运行时过滤器并将其推送到探测端。具体来说,它将过滤器推到探测端的最低级别扫描节点,这大大减少了要处理的数据量并提高了连接性能。Doris运行时过滤器支持In/Min/Max/Bloom过滤器。
Doris查询优化器(optimizer )是CBO和RBO的组合。RBO支持常量折叠、子查询重写和谓词下推,而CBO支持连接重新排序。Doris CBO正在不断优化,以获得更准确的统计数据收集和推断,以及更准确的成本模型。
2、Quick Start
本指南介绍如何下载最新稳定版本的Doris,将其安装在单个节点上并使其运行,包括创建数据库、数据表、导入数据和执行查询的步骤。
2.1 先决条件
- 主流的Linux X86-64环境。推荐使用CentOS 7.1或Ubuntu 16.04及以上版本。有关更多环境的指南,请参阅文档的“安装和部署”部分。
- 安装Java 8运行时环境。(如果您不是Oracle JDK商用license用户,我们建议您使用免费的Oracle JDK 8u202。现在下载。)
- 建议为Linux操作系统的Doris创建一个新用户(避免使用root用户,以免对操作系统造成意外操作)。
2.2 下载二进制包
从doris.apache.org下载Doris安装包,并执行以下步骤。
# Download the binary installation package of Doris
server1:~ doris$ wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0.3-bin-x64.tar.gz# Extract the installation package
server1:~ doris$ tar zxf apache-doris-2.0.3-bin-x64.tar.gz# Rename the directory to apache-doris for simplicity
server1:~ doris$ mv apache-doris-2.0.3-bin-x64 apache-doris
2.3 Install Doris
Configure FE
进入apache-doris/fe/fe.conf
文件进行fe配置。下面是一些需要注意的关键配置。手动添加JAVA_HOME
并将其指向JDK8运行时环境。对于其他配置,您可以使用默认值以获得快速的单机体验。
# Add JAVA_HOME and point it to your JDK8 runtime environment. Suppose your JDK8 is at /home/doris/jdk8, set it as follows:
JAVA_HOME=/home/doris/jdk8# The CIDR network segment of FE listening IP is empty by default. When started, Doris will automatically select an available network segment. If you need to specify a segment, you can set priority_networks=92.168.0.0/24, for example.
# priority_networks =# By default, FE metadata is stored in the doris-meta directory under DORIS_HOME. It is created already. You can change it to your specified path.
# meta_dir = ${DORIS_HOME}/doris-meta
Start FE
在apache-doris/fe
目录下执行如下命令启动FE。
# Start FE in the background to ensure that the process continues running even after exiting the terminal.
server1:apache-doris/fe doris$ ./bin/start_fe.sh --daemon
Configure BE
进入apache-doris/be/be.conf
文件进行be配置。下面是一些需要注意的关键配置。手动添加JAVA_HOME
并将其指向JDK8运行时环境。对于其他配置,您可以使用默认值以获得快速的单机体验。
# Add JAVA_HOME and point it to your JDK8 runtime environment. Suppose your JDK8 is at /home/doris/jdk8, set it as follows:
JAVA_HOME=/home/doris/jdk8# The CIDR network segment of BE listening IP is empty by default. When started, Doris will automatically select an available network segment. If you need to specify a segment, you can set priority_networks=192.168.0.0/24, for example.
# priority_networks =# By default, BE data is stored in the storage directory under DORIS_HOME. It is created already. You can change it to your specified path.
# storage_root_path = ${DORIS_HOME}/storage
Start BE
在apache-doris/be
下执行以下命令启动BE 。
# Start BE in the background to ensure that the process continues running even after exiting the terminal.
server1:apache-doris/be doris$ ./bin/start_be.sh --daemon
Connect to Doris FE
下载兼容性MySQL客户端连接到Doris FE。
解压缩客户端,在bin/
目录下找到mysql
命令行工具。然后执行以下命令连接到Doris。
mysql -uroot -P9030 -h127.0.0.1
注意:
- 这里的root用户是Doris内置的超级管理员用户。有关详细信息,请参阅身份验证和授权。
-P
:指定所连接的查询端口。默认端口号为9030。它对应于fe.conf
中的query_port
设置。-h
:指定所连接FE的IP地址。如果您的客户机和FE安装在同一节点上,则可以使用127.0.0.1。
将BE节点加入集群
在MySQL客户端执行一个示例SQL,将BE节点添加到集群中:
ALTER SYSTEM ADD BACKEND "be_host_ip:heartbeat_service_port";
Note:
be_host_ip
:待扩容BE节点的IP地址heartbeat_service_port
:待扩容BE节点的心跳上报端口,在be.conf
中查找heartbeat_service_port
,默认设置为9050
- 您可以使用“show backends”语句查看新添加的BE节点。
修改root和admin用户的密码
在MySQL客户端设置root和admin用户新密码的sql示例:
mysql> SET PASSWORD FOR 'root' = PASSWORD('doris-root-password');
Query OK, 0 rows affected (0.01 sec) mysql> SET PASSWORD FOR 'admin' = PASSWORD('doris-admin-password');
Query OK, 0 rows affected (0.00 sec)
root用户和admin用户的区别
“root”和“admin”是安装Doris后自动创建的两个默认帐户。root用户拥有整个集群的超级用户权限,可以执行各种管理操作,例如添加或删除节点。admin用户不具有管理员权限,是集群内的超级用户,拥有除集群管理相关权限外的所有权限。建议仅在集群管理和维护需要时使用root权限。
2.4 创建数据库和表
Connect to Doris
使用admin帐号连接到Doris FE。
mysql -uadmin -P9030 -h127.0.0.1
如果连接到127.0.0.1
的MySQL客户端与FE在同一台机器上,则不需要密码。
创建数据库和表
create database demo;use demo;
create table mytable
(k1 TINYINT,k2 DECIMAL(10, 2) DEFAULT "10.05", k3 CHAR(10) COMMENT "string column", k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1');
数据获取
保存以下示例数据到本地的“data.csv
”文件:
1,0.14,a1,20
2,1.04,b2,21
3,3.14,c3,22
4,4.35,d4,23
使用Stream Load
方法将“data.csv”中的数据加载到新创建的表中。
curl --location-trusted -u admin:admin_password -T data.csv -H "column_separator:," http://127.0.0.1:8030/api/demo/mytable/_stream_load
-T data.csv
:数据文件名-u admin:admin_password
: admin帐号和密码127.0.0.1:8030
: FE的IP和http_port
一旦成功执行,将返回如下消息:
{ "TxnId": 30, "Label": "a56d2861-303a-4b50-9907-238fea904363", "Comment": "", "TwoPhaseCommit": "false", "Status": "Success", "Message": "OK", "NumberTotalRows": 4, "NumberLoadedRows": 4, "NumberFilteredRows": 0, "NumberUnselectedRows": 0, "LoadBytes": 52, "LoadTimeMs": 206, "BeginTxnTimeMs": 13, "StreamLoadPutTimeMs": 141, "ReadDataTimeMs": 0, "WriteDataTimeMs": 7, "CommitAndPublishTimeMs": 42
}
NumberLoadedRows
:已加载的行数NumberTotalRows
:要加载的行总数Status
:“Success”表示数据加载成功。
2.5 查询数据
在MySQL客户端执行如下SQL查询加载的数据:
mysql> select * from mytable;
+------+------+------+------+
| k1 | k2 | k3 | k4 |
+------+------+------+------+
| 1 | 0.14 | a1 | 20 |
| 2 | 1.04 | b2 | 21 |
| 3 | 3.14 | c3 | 22 |
| 4 | 4.35 | d4 | 23 |
+------+------+------+------+
4 rows in set (0.01 sec)
2.6 Stop Doris
Stop FE
在apache-doris/fe
下执行以下命令停止FE。
server1:apache-doris/fe doris$ ./bin/stop_fe.sh
Stop BE
在apache-doris/be
目录下执行如下命令停止BE。
server1:apache-doris/be doris$ ./bin/stop_be.sh