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

itxiaoshen發表於2022-05-12

概述

背景

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

Apache Doris GitHub原始碼地址 https://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官網地址 https://www.starrocks.com/zh-CN/index 目前最新版本為2.2.0

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

StarRocks GitHub原始碼地址 https://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 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

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,http://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

相關文章