StarRocks調研


StarRocks調研

簡介

StarRocks

StarRocks原名DorisDB,是新一代極速全場景MPP數據庫。StarRocks 是 Apache Doris 的 Fork 版本。

官網地址:https://www.starrocks.com/zh-CN/index

StarRocks 分為社區版和企業版,社區版為開源,企業版需付費使用。社區版支持了大部分的功能,但不支持StarRocks Manager(可視化運維監控平台),在數據庫管理上不太方便。

StarRocks特性

StarRocks的架構設計融合了MPP數據庫,以及分布式系統的設計思想,具有以下特性:

架構精簡

StarRocks內部通過MPP計算框架完成SQL的具體執行工作。MPP框架本身能夠充分的利用多節點的計算能力,整個查詢並行執行,從而實現良好的交互式分析體驗。 StarRocks集群不需要依賴任何其他組件,易部署、易維護,極簡的架構設計,降低了StarRocks系統的復雜度和維護成本,同時也提升了系統的可靠性和擴展性。

標准SQL

StarRocks支持標准的SQL語法,包括聚合、JOIN、排序、窗口函數和自定義函數等功能。StarRocks可以完整支持TPC-H的22個SQL和TPC-DS的99個SQL。StarRocks還兼容MySQL協議語法,可使用現有的各種客戶端工具、BI軟件訪問StarRocks,對StarRocks中的數據進行拖拽式分析。

全面向量化引擎

StarRocks的計算層全面采用了向量化技術,將所有算子、函數、掃描過濾和導入導出模塊進行了系統性優化。通過列式的內存布局、適配CPU的SIMD指令集等手段,充分發揮了現代CPU的並行計算能力,從而實現亞秒級別的多維分析能力。

智能查詢優化

StarRocks通過CBO優化器(Cost Based Optimizer)可以對復雜查詢自動優化。無需人工干預,就可以通過統計信息合理估算執行成本,生成更優的執行計划,大大提高了Adhoc和ETL場景的數據分析效率。

聯邦查詢

StarRocks支持使用外表的方式進行聯邦查詢,當前可以支持Hive、MySQL、Elasticsearch三種類型的外表,用戶無需通過數據導入,可以直接進行數據查詢加速。

高效更新

StarRocks支持多種數據模型,其中更新模型可以按照主鍵進行upsert/delete操作,通過存儲和索引的優化可以在並發更新的同時實現高效的查詢優化,更好的服務實時數倉的場景。

智能物化視圖

StarRocks支持智能的物化視圖。用戶可以通過創建物化視圖,預先計算生成預聚合表用於加速聚合類查詢請求。StarRocks的物化視圖能夠在數據導入時自動完成匯聚,與原始表數據保持一致。並且在查詢的時候,用戶無需指定物化視圖,StarRocks能夠自動選擇最優的物化視圖來滿足查詢請求。

流批一體

StarRocks支持實時和批量兩種數據導入方式,支持的數據源有Kafka、HDFS、本地文件,支持的數據格式有ORC、Parquet和CSV等,StarRocks可以實時消費Kafka數據來完成數據導入,保證數據不丟不重(exactly once)。StarRocks也可以從本地或者遠程(HDFS)批量導入數據。

極簡運維

StarRocks具有高可用易擴展的特性,元數據和數據都是多副本存儲,並且集群中服務有熱備,多實例部署,避免了單點故障。集群具有自愈能力,可彈性恢復,節點的宕機、下線、異常都不會影響StarRocks集群服務的整體穩定性。

StarRocks采用分布式架構,存儲容量和計算能力可近乎線性水平擴展。StarRocks單集群的節點規模可擴展到數百節點,數據規模可達到10PB級別。 擴縮容期間無需停服,可以正常提供查詢服務。 另外StarRocks中表模式熱變更,可通過一條簡單SQL命令動態地修改表的定義,例如增加列、減少列、新建物化視圖等。同時,處於模式變更中的表也可也正常導入和查詢數據。

StarRocks是一個自治的系統。節點的上下線,集群擴縮容都可通過一條簡單的SQL命令來完成。

系統架構

architecture

組件介紹

StarRocks集群由FE和BE構成, 可以使用MySQL客戶端訪問StarRocks集群。

FE(FrontEnd)

FE接收MySQL客戶端的連接, 解析並執行SQL語句。

  • 管理元數據, 執行SQL DDL命令, 用Catalog記錄庫, 表, 分區, tablet副本等信息。
  • FE高可用部署, 使用復制協議選主和主從同步元數據, 所有的元數據修改操作, 由FE leader節點完成, FE follower節點可執行讀操作。 元數據的讀寫滿足順序一致性。 FE的節點數目采用2n+1, 可容忍n個節點故障。 當FE leader故障時, 從現有的follower節點重新選主, 完成故障切換。
  • FE的SQL layer對用戶提交的SQL進行解析, 分析, 改寫, 語義分析和關系代數優化, 生產邏輯執行計划。
  • FE的Planner負責把邏輯計划轉化為可分布式執行的物理計划, 分發給一組BE。
  • FE監督BE, 管理BE的上下線, 根據BE的存活和健康狀態, 維持tablet副本的數量。
  • FE協調數據導入, 保證數據導入的一致性。

BE(BackEnd)

  • BE管理tablet副本, tablet是table經過分區分桶形成的子表, 采用列式存儲。
  • BE受FE指導, 創建或刪除子表。
  • BE接收FE分發的物理執行計划並指定BE coordinator節點, 在BE coordinator的調度下, 與其他BE worker共同協作完成執行。
  • BE讀本地的列存儲引擎獲取數據,並通過索引和謂詞下沉快速過濾數據。
  • BE后台執行compact任務, 減少查詢時的讀放大。
  • 數據導入時, 由FE指定BE coordinator, 將數據以fanout的形式寫入到tablet多副本所在的BE上。

其他組件

  • 管理平台(StarRocks Manager), 管理工具,提供DorisDB集群管理、在線查詢、故障查詢、監控報警的可視化工具。

  • Hdfs Broker: StarRocks 中和外部HDFS/對象存儲等外部數據對接的中轉服務,輔助提供導入導出功能。

StarRocks優勢

極速SQL查詢

  • 全新的向量化執行引擎,亞秒級查詢延時,單節點每秒可處理多達100億行數據。
  • 強大的MPP執行框架,支持星型模型和雪花模型,極致的Join性能。
  • 綜合查詢速度比其他產品快10-100倍
  • 查看性能測試報告

實時數據分析

  • 新型列式存儲引擎,支持大規模數據實時寫入,秒級實時性保證。
  • 支持業務指標實時聚合,加速實時多維數據分析。
  • 新型讀寫並發管理模式,可同時高效處理數據讀取和寫入。

高並發查詢

  • 靈活的資源分配策略,每秒可支持高達1萬以上的並發查詢。
  • 可高效支持數千用戶同時進行數據分析。

極簡運維

  • 支持在大數據規模下進行在線彈性擴展,擴容不影響線上業務。集群可擴展至數百節點,PB量級數據。
    集群運行高度自治化,故障自恢復,運維成本低。

國產核心軟件

  • 完全自主創新,全球領先。
  • 更完善的本地化專家服務體系。

StarRocks VS ClickHouse

指標 ClickHouse StarRocks
MPP架構 Scatter-Gather模式,聚合操作依賴單點完成,操作數據量大時有瓶頸 現代化MPP架構,可以實現多層聚合、大表Join
架構 依賴ZooKeeper進行DDL和Replica同步 內置分布式協議進行元數據同步Master/Follower/Observer節點類型
事務性 100萬以內原子性,DDL無事務保證 事務保證數據ACID
數據規模 單集群 < 10PB 單集群 < 10PB
標准SQL的支持 不支持標准的SQL語言 支持,兼容Mysql協議
分布式Join 不支持Join,僅支持大寬表模式 支持主流分布式Join,不僅支持大寬表模型,還支持星型和雪花模型
高並發查詢 不支持高並發 支持高並發
外表 支持MySQL/Hive的表 外查MySQL/ES/Hive的表
Exactly Once語義 不支持事務,無法保證數據寫入不丟不重 支持事務,可實現數據不丟不重
集群擴容 擴容需人工操作,工作量巨大,且影響線上服務 擴容只需要遷移部分數據分片,系統自動完成,不影響線上服務
運維要求 依賴ZK,運維和維護成本高 不依賴外部系統,極簡運維
成熟程度

使用場景

StarRocks可以滿足企業級用戶的多種分析需求,包括OLAP多維分析,定制報表,實時數據分析,Ad-hoc數據分析等。具體的業務場景包括:

適用場景

  • OLAP多維分析

  • 實時數據分析

  • 多用戶高並發查詢

  • Hadoop數倉加速

不適用場景

  • StarRocks目前主要解決 PB 級別的數據量(如果高於 PB 級別,不推薦使用 StarRocks解決,可以考慮用 Hive 等工具),解決結構化數據,查詢時間一般在秒級或毫秒級。
  • 不適合做大規模的批處理(處理過程不會落盤,因此會占用內存)

哪些大廠在使用

  • 小紅書
  • 58同城
  • 貝殼
  • 聯想
  • 好未來
  • 猿輔導
  • 中移物聯網

性能測試

因資源限制,暫未進行實際的性能測試。以下測試報告均來源於官網(https://www.starrocks.com/zh-CN/blog/1.8)。

Star schema benchmark(以下簡稱SSB)是學術界和工業界廣泛使用的一個星型模型測試集,通過這個測試集合可以方便的對比各種OLAP產品的基礎性能指標。Clickhouse 通過改寫SSB,將星型模型打平轉化成寬表,改造成了一個單表測試benchmark。本報告記錄了StarRocks、ApacheDoris和Clickhouse在SSB單表和多表數據集上進行了性能對比測試的結果。

測試環境

硬件環境:

機器 3台 阿里雲主機
CPU 16coreIntel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHzcache size : 36608 KB
內存 64GB
網絡帶寬 10Gbits/s
磁盤 ESSD高效雲盤

軟件環境:

內核版本:Linux 3.10.0-1127.13.1.el7.x86_64

操作系統版本:CentOS Linux release 7.8.2003

軟件版本:StarRocks 社區版 1.10,Aapche Doris 0.13,Clickhouse 20.13

測試數據

表名 行數 解釋
lineorder 6億 SSB商品訂單表
customer 300萬 SSB客戶表
part 140萬 SSB 零部件表
supplier 20萬 SSB 供應商表
dates 2556 日期表
lineorder_flat 6億 SSB打平后的寬表

測試結論

測試結論如下:

  • 在單表測試的13個查詢中,Apache Doris耗時最長;有9個查詢StarRocks查詢速度最快,另外4個查詢Clickhouse速度最快。
  • 單表測試中,13個查詢Clickhouse總耗時是StarRocks的1.33倍。
  • 在多表測試的13個查詢中,StarRocks平均比Apache Doris快6.8倍,部分查詢快10倍以上。

表設計

稀疏索引


表中數據組織有主要由三部分構成:

  1. shortkey index表: 表中數據每1024行, 構成一個邏輯block。 每個邏輯block在shortkey index表中存儲一項索引, 內容為表的維度列的前綴, 並且不超過36字節。 shortkey index為稀疏索引, 用數據行的維度列的前綴查找索引表, 可以確定該行數據所在邏輯塊的起始行號。
  2. Per-column data block: 表中每一列數據按64KB分塊存儲, 數據塊作為一個單位單獨編碼壓縮, 也作為IO單位, 整體寫回設備或者讀出。
  3. Per-column cardinal index: 表中的每列數據有各自的行號索引表, 列的數據塊和行號索引項一一對應, 索引項由數據塊的起始行號和數據塊的位置和長度信息構成, 用數據行的行號查找行號索引表, 可以獲取包含該行號的數據塊所在位置, 讀取目標數據塊后, 可以進一步查找數據。

由此可見, 查找維度列的前綴的查找過程為: 先查找shortkey index, 獲得邏輯塊的起始行號, 查找維度列的行號索引, 獲得目標列的數據塊, 讀取數據塊, 然后解壓解碼, 從數據塊中找到維度列前綴對應的數據項。

加速數據處理

  • 預先聚合

    StarRocks支持聚合模型, 維度列取值相同數據行可合並一行, 合並后數據行的維度列取值不變, 指標列的取值為這些數據行的聚合結果, 用戶需要給指標列指定聚合函數。 通過預先聚合, 可以加速聚合操作。

  • 分區分桶

    事實上StarRocks的表被划分成tablet, 每個tablet多副本冗余存儲在BE上, BE和tablet的數量可以根據計算資源和數據規模而彈性伸縮。 查詢時, 多台BE可並行地查找tablet快速獲取數據。 此外, tablet的副本可復制和遷移, 增強了數據的可靠性, 避免了數據傾斜。 總之, 分區分桶保證了數據訪問的高效性和穩定性。

  • RollUp表索引

    shortkey index可加速數據查找, 然后shortkey index依賴維度列排列次序。 如果使用非前綴的維度列構造查找謂詞, 則無法使用shortkey index。 用戶可以為數據表創建若干RollUp表索引, RollUp表索引的數據組織和存儲和數據表相同, 但RollUp表擁有自身的shortkey index。 用戶創建RollUp表索引時, 可選擇聚合的粒度, 列的數量, 維度列的次序; 使頻繁使用的查詢條件能夠命中相應的RollUp表索引。

  • 列級別的索引技術

    Bloomfilter可快速判斷數據塊中不含所查找值, ZoneMap通過數據范圍快速過濾待查找值, Bitmap索引可快速計算出枚舉類型的列滿足一定條件的行。

數據模型

  • 明細模型

    表中存在主鍵重復的數據行, 和攝入數據行一一對應, 用戶可以召回所攝入的全部歷史數據。

  • 聚合模型

    表中不存在主鍵重復的數據行, 攝入的主鍵重復的數據行合並為一行, 這些數據行的指標列通過聚合函數合並, 用戶可以召回所攝入的全部歷史數據的累積結果, 但無法召回全部歷史數據。

  • 更新模型&主鍵模型

    聚合模型的特殊情形, 主鍵滿足唯一性約束, 最近導入的數據行, 替換掉其他主鍵重復的數據行。 相當於在聚合模型中, 為數據表的指標列指定的聚合函數為REPLACE, REPLACE函數返回一組數據中的最新數據。

需要注意:

  • 建表語句, 排序列的定義必須出現在指標列定義之前。
  • 排序列在建表語句中的出現次序為數據行的多重排序的次序。
  • 排序鍵的稀疏索引(Shortkey Index)會選擇排序鍵的若干前綴列。

下載安裝部署

StarRocks的集群部署分為兩種模式,第一種是使用命令部署,第二種是使用 StarRocksManager 自動化部署。自動部署的版本只需要在頁面上簡單進行配置、選擇、輸入后批量完成,並且包含Supervisor進程管理、滾動升級、備份、回滾等功能。因 StarRocksManager並未開源,因此我們只能使用命令部署。

生產環境使用官方推薦配置:BE推薦16核64GB以上(StarRocks的元數據都在內存中保存),FE推薦8核16GB以上

下載地址:

https://www.starrocks.com/zh-CN/download/request-download/4

此部分文檔申請到虛機后進行完善。

服務器配置

IP host 配置 部署
192.168.130.178 fe1 4C16G FE主節點
192.168.130.183 be1 4C8G BE節點
192.168.130.36 be2 4C8G BE節點
192.168.130.149 be3 4C8G BE節點

下載社區版最新版本:StarRocks-1.19.1,因資源限制(使用4台虛機),FE采取單實例部署,BE部署三個實例。

FE單實例部署

# 修改fe配置
cd StarRocks-1.19.1/fe

# 配置文件conf/fe.conf
# 根據FE內存大小調整 -Xmx4096m,為了避免GC建議16G以上,StarRocks的元數據都在內存中保存。

# 創建元數據目錄
mkdir -p meta
# 啟動進程
bin/start_fe.sh --daemon

# 使用瀏覽器訪問8030端口, 打開StarRocks的WebUI, 用戶名為root, 密碼為空

StarRocks UI

http://192.168.130.178:8030/ 打開StarRocks的WebUI,,用戶名為root, 密碼為空。

使用MySQL客戶端訪問FE

第一步: 安裝mysql客戶端(如果已經安裝,可忽略此步):

Ubuntu:sudo apt-get install mysql-client

Centos:sudo yum install mysql-client

wget http://repo.mysql.com/mysql57-community-release-sles12.rpm

rpm -ivh mysql57-community-release-sles12.rpm

# 安裝mysql
yum install mysql-server

# 啟動mysql
service mysqld start

第二步: 使用mysql客戶端連接:

mysql -h 127.0.0.1 -P9030 -uroot

注意:這里默認root用戶密碼為空,端口為fe/conf/fe.conf中的query_port配置項,默認為9030

第三步: 查看FE狀態:

MySQL [(none)]> SHOW PROC '/frontends'\G
*************************** 1. row ***************************
             Name: 192.168.130.178_9010_1636811945380
               IP: 192.168.130.178
         HostName: fe1
      EditLogPort: 9010
         HttpPort: 8030
        QueryPort: 9030
          RpcPort: 9020
             Role: FOLLOWER
         IsMaster: true
        ClusterId: 985620692
             Join: true
            Alive: true
ReplayedJournalId: 43507
    LastHeartbeat: 2021-11-15 14:41:48
         IsHelper: true
           ErrMsg: 
1 row in set (0.05 sec)

Role為FOLLOWER說明這是一個能參與選主的FE;IsMaster為true,說明該FE當前為主節點。

如果MySQL客戶端連接不成功,請查看log/fe.warn.log日志文件,確認問題。由於是初次啟動,如果在操作過程中遇到任何意外問題,都可以刪除並重新創建FE的元數據目錄,再從頭開始操作。

BE部署

BE的基本配置

BE的配置文件為StarRocks-1.19.1/be/conf/be.conf,默認配置已經足以啟動集群,不建議初嘗用戶修改配置, 有經驗的用戶可以查看手冊的系統配置章節,為生產環境定制配置。 為了讓用戶更好的理解集群的工作原理, 此處只列出基礎配置。

192.168.130.183

# 修改fe配置
cd StarRocks-1.19.1/be

# 配置文件conf/fe.conf
# 調整BE參數,默認配置已經足以啟動集群,暫不做調整。

# 創建元數據目錄
mkdir -p storage

# 通過mysql客戶端添加BE節點。
# 這里IP地址為和priority_networks設置匹配的IP,portheartbeat_service_port,默認為9050
mysql> ALTER SYSTEM ADD BACKEND "be1:9050";

# 啟動be
bin/start_be.sh --daemon


添加BE節點如出現錯誤,需要刪除BE節點,應用下列命令:

  • alter system decommission backend "be_host:be_heartbeat_service_port";
  • alter system dropp backend "be_host:be_heartbeat_service_port";

具體參考擴容縮容

# 查看防火牆狀態
[root@be1 be]# systemctl status firewalld
# 如已開啟,需關閉防火牆,防止網絡不通,導致BE和FE無法連接
[root@be1 be]# systemctl stop firewalld

第四步: 查看BE狀態, 確認BE就緒。同樣步驟添加另外兩個BE節點,mysql客戶端中執行

MySQL [(none)]> SHOW PROC '/backends' \G;
*************************** 1. row ***************************
            BackendId: 163038
              Cluster: default_cluster
                   IP: 192.168.130.183
             HostName: be1
        HeartbeatPort: 9050
               BePort: 9060
             HttpPort: 8040
             BrpcPort: 8060
        LastStartTime: 2021-11-21 13:56:47
        LastHeartbeat: 2021-11-21 14:58:35
                Alive: true
 SystemDecommissioned: false
ClusterDecommissioned: false
            TabletNum: 5
     DataUsedCapacity: .000 
        AvailCapacity: 33.451 GB
        TotalCapacity: 36.974 GB
              UsedPct: 9.53 %
       MaxDiskUsedPct: 9.53 %
               ErrMsg: 
              Version: 1.19.1-65e87c3
               Status: {"lastSuccessReportTabletsTime":"2021-11-21 14:57:48"}
    DataTotalCapacity: 33.451 GB
          DataUsedPct: 0.00 %
*************************** 2. row ***************************
            BackendId: 163066
              Cluster: default_cluster
                   IP: 192.168.130.36
             HostName: be2
        HeartbeatPort: 9050
               BePort: 9060
             HttpPort: 8040
             BrpcPort: 8060
        LastStartTime: 2021-11-21 14:56:34
        LastHeartbeat: 2021-11-21 14:58:35
                Alive: true
 SystemDecommissioned: false
ClusterDecommissioned: false
            TabletNum: 5
     DataUsedCapacity: .000 
        AvailCapacity: 33.452 GB
        TotalCapacity: 36.974 GB
              UsedPct: 9.53 %
       MaxDiskUsedPct: 9.53 %
               ErrMsg: 
              Version: 1.19.1-65e87c3
               Status: {"lastSuccessReportTabletsTime":"2021-11-21 14:58:35"}
    DataTotalCapacity: 33.452 GB
          DataUsedPct: 0.00 %
*************************** 3. row ***************************
            BackendId: 163072
              Cluster: default_cluster
                   IP: 192.168.130.149
             HostName: be3
        HeartbeatPort: 9050
               BePort: 9060
             HttpPort: 8040
             BrpcPort: 8060
        LastStartTime: 2021-11-21 14:58:15
        LastHeartbeat: 2021-11-21 14:58:35
                Alive: true
 SystemDecommissioned: false
ClusterDecommissioned: false
            TabletNum: 3
     DataUsedCapacity: .000 
        AvailCapacity: 33.521 GB
        TotalCapacity: 36.974 GB
              UsedPct: 9.34 %
       MaxDiskUsedPct: 9.34 %
               ErrMsg: 
              Version: 1.19.1-65e87c3
               Status: {"lastSuccessReportTabletsTime":"2021-11-21 14:58:16"}
    DataTotalCapacity: 33.521 GB
          DataUsedPct: 0.00 %

如果isAlive為true,則說明BE正常接入集群。如果BE沒有正常接入集群,請查看log目錄下的be.WARNING日志文件確定原因。

image-20211121150046678

至此,安裝完成。

參數設置

  • Swappiness

關閉交換區,消除交換內存到虛擬內存時對性能的擾動。

echo 0 | sudo tee /proc/sys/vm/swappiness
  • Compaction相關

當使用聚合表或更新模型,導入數據比較快的時候,可在配置文件 be.conf 中修改下列參數以加速compaction。

cumulative_compaction_num_threads_per_disk = 4
base_compaction_num_threads_per_disk = 2
cumulative_compaction_check_interval_seconds = 2
  • 並行度

在客戶端執行命令,修改StarRocks的並行度(類似clickhouse set max_threads= 8)。並行度可以設置為當前機器CPU核數的一半。

set global parallel_fragment_exec_instance_num =  8;

使用MySQL客戶端訪問StarRocks

Root用戶登錄

使用MySQL客戶端連接某一個FE實例的query_port(9030), StarRocks內置root用戶,密碼默認為空:

mysql -h fe_host -P9030 -u root

清理環境:

mysql > drop database if exists example_db;

mysql > drop user test;

創建新用戶

通過下面的命令創建一個普通用戶:

mysql > create user 'test_xxx' identified by 'xxx123456';

創建數據庫

StarRocks中root賬戶才有權建立數據庫,使用root用戶登錄,建立example_db數據庫:

mysql > create database test_xxx_db;

數據庫創建完成之后,可以通過show databases查看數據庫信息:

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| _statistics_       |
| information_schema |
| test_xxx_db        |
+--------------------+
3 rows in set (0.00 sec)

information_schema是為了兼容mysql協議而存在,實際中信息可能不是很准確,所以關於具體數據庫的信息建議通過直接查詢相應數據庫而獲得。

賬戶授權

example_db創建完成之后,可以通過root賬戶example_db讀寫權限授權給test賬戶,授權之后采用test賬戶登錄就可以操作example_db數據庫了:

mysql > grant all on test_xxx_db to test_xxx;

退出root賬戶,使用test登錄StarRocks集群:

mysql > exit

mysql -h 127.0.0.1 -P9030 -utest_xxx -pxxx123456

建表

StarRocks支持支持單分區和復合分區兩種建表方式。

在復合分區中:

  • 第一級稱為Partition,即分區。用戶可以指定某一維度列作為分區列(當前只支持整型和時間類型的列),並指定每個分區的取值范圍。
  • 第二級稱為Distribution,即分桶。用戶可以指定某幾個維度列(或不指定,即所有KEY列)以及桶數對數據進行HASH分布。

以下場景推薦使用復合分區:

  • 有時間維度或類似帶有有序值的維度:可以以這類維度列作為分區列。分區粒度可以根據導入頻次、分區數據量等進行評估。
  • 歷史數據刪除需求:如有刪除歷史數據的需求(比如僅保留最近N 天的數據)。使用復合分區,可以通過刪除歷史分區來達到目的。也可以通過在指定分區內發送DELETE語句進行數據刪除。
  • 解決數據傾斜問題:每個分區可以單獨指定分桶數量。如按天分區,當每天的數據量差異很大時,可以通過指定分區的分桶數,合理划分不同分區的數據,分桶列建議選擇區分度大的列。

用戶也可以不使用復合分區,即使用單分區。則數據只做HASH分布。

下面分別演示兩種分區的建表語句:

  1. 首先切換數據庫:mysql > use test_xxx_db;
  2. 建立單分區表建立一個名字為table1的邏輯表。使用全hash分桶,分桶列為siteid,桶數為10。這個表的schema如下:
  • siteid:類型是INT(4字節), 默認值為10
  • city_code:類型是SMALLINT(2字節)
  • username:類型是VARCHAR, 最大長度為32, 默認值為空字符串
  • pv:類型是BIGINT(8字節), 默認值是0; 這是一個指標列, StarRocks內部會對指標列做聚合操作, 這個列的聚合方法是求和(SUM)。這里采用了聚合模型,除此之外StarRocks還支持明細模型和更新模型,具體參考數據模型介紹

建表語句如下:

mysql >
CREATE TABLE table1
(
    siteid INT DEFAULT '10',
    citycode SMALLINT,
    username VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, citycode, username)
DISTRIBUTED BY HASH(siteid) BUCKETS 10
PROPERTIES("replication_num" = "1");
  1. 建立復合分區表

建立一個名字為table2的邏輯表。這個表的 schema 如下:

  • event_day:類型是DATE,無默認值
  • siteid:類型是INT(4字節), 默認值為10
  • city_code:類型是SMALLINT(2字節)
  • username:類型是VARCHAR, 最大長度為32, 默認值為空字符串
  • pv:類型是BIGINT(8字節), 默認值是0; 這是一個指標列, StarRocks 內部會對指標列做聚合操作, 這個列的聚合方法是求和(SUM)

我們使用event_day列作為分區列,建立3個分區: p1, p2, p3

  • p1:范圍為 [最小值, 2017-06-30)
  • p2:范圍為 [2017-06-30, 2017-07-31)
  • p3:范圍為 [2017-07-31, 2017-08-31)

每個分區使用siteid進行哈希分桶,桶數為10。

建表語句如下:

CREATE TABLE table2
(
event_day DATE,
siteid INT DEFAULT '10',
citycode SMALLINT,
username VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, siteid, citycode, username)
PARTITION BY RANGE(event_day)
(
PARTITION p1 VALUES LESS THAN ('2017-06-30'),
PARTITION p2 VALUES LESS THAN ('2017-07-31'),
PARTITION p3 VALUES LESS THAN ('2017-08-31')
)
DISTRIBUTED BY HASH(siteid) BUCKETS 10
PROPERTIES("replication_num" = "1");

表建完之后,可以查看example_db中表的信息:

mysql> show tables;

+-------------------------+
| Tables_in_example_db    |
+-------------------------+
| table1                  |
| table2                  |
+-------------------------+
2 rows in set (0.01 sec)

  <br/>

mysql> desc table1;

+----------+-------------+------+-------+---------+-------+
| Field    | Type        | Null | Key   | Default | Extra |
+----------+-------------+------+-------+---------+-------+
| siteid   | int(11)     | Yes  | true  | 10      |       |
| citycode | smallint(6) | Yes  | true  | N/A     |       |
| username | varchar(32) | Yes  | true  |         |       |
| pv       | bigint(20)  | Yes  | false | 0       | SUM   |
+----------+-------------+------+-------+---------+-------+
4 rows in set (0.00 sec)

  <br/>

mysql> desc table2;

+-----------+-------------+------+-------+---------+-------+
| Field     | Type        | Null | Key   | Default | Extra |
+-----------+-------------+------+-------+---------+-------+
| event_day | date        | Yes  | true  | N/A     |       |
| siteid    | int(11)     | Yes  | true  | 10      |       |
| citycode  | smallint(6) | Yes  | true  | N/A     |       |
| username  | varchar(32) | Yes  | true  |         |       |
| pv        | bigint(20)  | Yes  | false | 0       | SUM   |
+-----------+-------------+------+-------+---------+-------+
5 rows in set (0.00 sec)

MySQL [(none)]> use test_xxx_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [test_xxx_db]> insert into table1 values(1,3708,'zhaop',0);
Query OK, 1 row affected (0.20 sec)
{'label':'insert_d7aee4d4-52a4-11ec-be98-fa163e7a663b', 'status':'VISIBLE', 'txnId':'2005'}


MySQL [test_xxx_db]> select * from table1;
+--------+----------+----------+------+
| siteid | citycode | username | pv   |
+--------+----------+----------+------+
|      1 |     3708 | zhaop    |    0 |
+--------+----------+----------+------+
1 row in set (0.03 sec)

導入數據

curl --location-trusted -u test_xxx:xxx123456 -T table1_data -H "label: table1_20211121" \
    -H "column_separator:," \
    http://127.0.0.1:8030/api/test_xxx_db/table1/_stream_load
    
## 報錯
curl: Can't open 'table1_data'!
curl: try 'curl --help' or 'curl --manual' for more information

問題

1.修改系統文件限制

2.執行sql報錯

MySQL [test_xxx_db]> select * from table1;
ERROR 1064 (HY000): Could not initialize class com.starrocks.rpc.BackendServiceProxy

后台日志:

2021-11-21 16:03:49,835 WARN (starrocks-mysql-nio-pool-31|379) [StmtExecutor.execute():456] execute Exception, sql select * from table1
java.lang.NoClassDefFoundError: Could not initialize class com.starrocks.rpc.BackendServiceProxy
	at com.starrocks.qe.Coordinator$BackendExecState.execRemoteFragmentAsync(Coordinator.java:1695) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.Coordinator.exec(Coordinator.java:522) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.StmtExecutor.handleQueryStmt(StmtExecutor.java:771) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.StmtExecutor.execute(StmtExecutor.java:371) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:248) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.ConnectProcessor.dispatch(ConnectProcessor.java:397) ~[starrocks-fe.jar:?]
	at com.starrocks.qe.ConnectProcessor.processOnce(ConnectProcessor.java:633) ~[starrocks-fe.jar:?]
	at com.starrocks.mysql.nio.ReadListener.lambda$handleEvent$480(ReadListener.java:54) ~[starrocks-fe.jar:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_312]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_312]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_312]

解決:openjdk改為

[root@fe1 jre-1.8.0-openjdk]# java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

# 修改為
[root@fe1 java]# java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mod
  1. BE啟動失敗,java.net.NoRouteToHostException: No route to host (Host unreachable)
# 報錯信息
W1128 23:13:56.493264 24083 utils.cpp:90] Fail to get master client from cache. host= port=0 code=THRIFT_RPC_ERROR
# 查看防火牆狀態
[root@be1 be]# systemctl status firewalld
# 如已開啟,需關閉防火牆,防止網絡不通,導致BE和FE無法連接
[root@be1 be]# systemctl stop firewalld


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM