國產開源優秀新一代MPP資料庫StarRocks入門之旅-數倉新利器(上)

概述

背景

Apache Doris官方地址 //doris.apache.org/

Apache Doris GitHub源碼地址 //github.com/apache/incubator-doris

  • 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官網地址 //www.starrocks.com/zh-CN/index 目前最新版本為2.2.0

StarRocks官網文檔地址 //docs.starrocks.com/zh-cn/main/introduction/StarRocks_intro

StarRocks GitHub源碼地址 //github.com/StarRocks/starrocks

  • StarRocks是新一代極速全場景MPP資料庫。
  • StarRocks充分吸收關係型OLAP資料庫和分散式存儲系統在大數據時代的優秀研究成果,在業界實踐的基礎上,進一步改進優化、升級架構,並增添了眾多全新功能,形成了全新的企業級產品。
  • StarRocks致力於構建極速統一分析體驗,滿足企業用戶的多種數據分析場景,支援多種數據模型(明細模型、聚合模型、更新模型),多種導入方式(批量和實時),支援導入多達10000列的數據,可整合和接入多種現有系統(Spark、Flink、Hive、 ElasticSearch)。
  • StarRocks兼容MySQL協議,可使用MySQL客戶端和常用BI工具對接StarRocks來進行數據分析。
  • StarRocks採用分散式架構,對數據表進行水平劃分並以多副本存儲。集群規模可以靈活伸縮,能夠支援10PB級別的數據分析; 支援MPP框架,並行加速計算; 支援多副本,具有彈性容錯能力。
  • StarRocks採用關係模型,使用嚴格的數據類型和列式存儲引擎,通過編碼和壓縮技術,降低讀寫放大;使用向量化執行方式,充分挖掘多核CPU的並行計算能力,從而顯著提升查詢性能。

發布路線

這個是StarRocks2021年前規劃,現在最新版本已為2.2.0

image-20220511105637566

特性

  • 架構精簡: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查詢等場景,降低系統複雜度和多技術棧開發與維護成本。

與其他分析層數倉框架對比,其極速統一架構如下

image-20220511105820817

與Flink生態對接

image-20220511110217211

基本概念和架構

系統架構圖

image-20220510135840327

組件介紹

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 指令集。

image-20220510164948879

測試集群建議節點配置: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

部署

部署規劃

伺服器IP 伺服器角色
192.168.5.52 FE、BE、Broker
192.168.5.53 BE、Broker
192.168.12.28 BE、Broker

下載

# 從官網下載
wget //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

image-20220510153631772

查看FE目錄結構

image-20220510155814332
查看BE目錄結構

image-20220510155533349

部署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 確認。

image-20220510161203780

  • 如果 FE 啟動失敗,可能是由於埠號被佔用,可修改配置文件 conf/fe.conf 中的埠號 http_port。
  • 使用 jps 命令查看 java 進程確認 “StarRocksFe” 存在。
  • 使用瀏覽器訪問 FE ip:http_port(默認 8030),打開 StarRocks 的 WebUI, 用戶名為 root, 密碼為空。

訪問 StarRocks 的 WebUI,//192.168.5.52:8030

image-20220510160925923
使用 MySQL 客戶端訪問 FE,這裡默認 root 用戶密碼為空,埠為 fe/conf/fe.conf 中的 query_port 配置項,默認為 9030,查看 FE 狀態是正常

image-20220510161111823

通過SQLyog的第三方MySQL客戶端連接和查詢結果

image-20220510163516143

部署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 就緒:

image-20220510161613480

顯示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,查看

image-20220510171748020

啟動192.168.5.52的BE,查看

image-20220511165635154

部署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 狀態:

image-20220510163008083

繼續部署其他兩個broker,三個broker的狀態都是正常

image-20220511165502366

實戰使用

表創建示例

# 使用 root 用戶建立 example_db 資料庫
mysql> create database example_db;
# 通過 `show databases;` 查看資料庫資訊:
mysql> show databases;

image-20220510163653484
通過官方提供建表腳本創建表

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"
);

image-20220511170021800

# 命令查看當前庫的所有表
mysql> show tables;
# 查看錶結構
mysql> desc detailDemo;
# 查看建表語句,在 StarRocks 中欄位名不區分大小寫,表名區分大小寫
mysql> show create table detailDemo;

image-20220511170607492

建表語句說明

  • 排序鍵

    • StarRocks 表內部組織存儲數據時會按照指定列排序,這些列為排序列(Sort Key),明細模型中由 DUPLICATE KEY 指定排序列,以上 demo 中的 make_time, mache_verson 兩列為排序列。注意排序列在建表時應定義在其他列之前。排序鍵詳細描述以及不同數據模型的表的設置方法請參考 排序鍵
  • 欄位類型

    • StarRocks 表中支援多種欄位類型,除 demo 中已經列舉的欄位類型,還支援 BITMAP 類型HLL 類型Array 類型,欄位類型介紹詳見 數據類型章節
    • 建表時盡量使用精確的類型。例如整形就不要用字元串類型,INT 類型滿足則不要使用 BIGINT,精確的數據類型能夠更好的發揮資料庫的性能。
  • 分區,分桶

  • 數據模型

    • DUPLICATE 關鍵字表示當前表為明細模型,KEY 中的列表示當前表的排序列。StarRocks 支援多種數據模型,分別為 明細模型聚合模型更新模型主鍵模型。不同模型的適用於多種業務場景,合理選擇可優化查詢效率。
  • 索引

注意:索引創建對錶模型和列有要求,詳細說明見對應索引介紹章節。

  • ENGINE 類型
    • 默認為 olap。可選 mysql,elasticsearch,hive,ICEBERG 代表創建表為 外部表

**本人部落格網站 **IT小神 www.itxiaoshen.com