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