博客 / 詳情

返回

如何構建面向海量數據、高實時要求的企業級OLAP數據引擎?

在字節跳動各產品線飛速成長的過程中,對數據分析能力也提出了更高的要求,現有的主流數據分析產品都沒辦法完全滿足業務要求。因此,字節跳動在ClickHouse引擎基礎上重構了技術架構,實現了雲原生環境的部署和運維管理、存儲計算分離、多租户管理等能力,推出了雲原生數據倉庫ByteHouse。
在性能、可擴展性、穩定性、可運維性以及資源利用率方面都實現了巨大提升,能夠很好的滿足字節跳動數據量極大、實時性要求極高、場景豐富的業務需求。
我們可以從下面幾個方面認識ByteHouse:

極致性能

在延續了ClickHouse單表查詢強大性能的同時,新增了自研的查詢優化器,在多表關聯查詢和複雜查詢場景下性能提升若干倍,實現了在各類型查詢中都達到極致性能。

新一代MPP架構,存算分離

使用新式架構,Shared-nothing的計算層和Shared-everything的存儲層,可以性能損耗很小的情況下,實現存儲層與計算層的分離,獨立按需擴縮容。

資源隔離,讀寫分離

對硬件資源進行靈活切割分配,按需擴縮容。資源有效隔離,讀寫分開資源管理,任務之間互不影響,杜絕了大查詢打滿所有資源拖垮集羣的現象。

豐富功能

ByteHouse提供客户豐富的企業級能力,如:兼容ANSI-SQL 2011標準、支持多租户、庫表資產管理、基於角色的權限管理以及多樣的性能診斷工具等。

ByteHouse架構設計

圖片
ByteHouse整體架構圖

雲原生數據倉庫ByteHouse總體架構圖如上圖所示,設計目標是實現高擴展性、高性能、高可靠性、高易用性。從下往上,總體上分服務層、計算層和存儲層。

服務層

服務層包括了所有與用户交互的內容,包括用户管理、身份驗證、查詢優化器,事務管理、安全管理、元數據管理,以及運維監控、數據查詢等可視化操作功能。
服務層主要包括如下組件:

資源管理器

資源管理器(Resource Manager)負責對計算資源進行統一的管理和調度,能夠收集各個計算組的性能數據,為查詢、寫入和後台任務動態分配資源。同時支持計算資源隔離和共享,資源池化和彈性擴縮等功能。資源管理器是提高集羣整體利用率的核心組件。

服務節點

服務節點(CNCH Server)可以看成是Query執行的master或者是coordinator。每一個計算組有1個或者多個CNCH Server,負責接受用户的query請求,解析query,生成邏輯執行計劃,優化執行計劃,調度和執行query,並將最終結果返回給用户。計算組是 Bytehouse 中的計算資源集羣,可按需進行橫向擴展。服務節點是無狀態的,意味着用户可以接入任意一個服務節點(當然如果有需要,也可以隔離開),並且可以水平擴展,意味着平台具備支持高併發查詢的能力。

元數據服務

元數據服務(Catalog Service)提供對查詢相關元數據信息的讀寫。Metadata主要包括2部分:Table的元數據和Part的元數據。
表的元數據信息主要包括表的Schema,partitioning schema,primary key,ordering key。Part的元數據信息記錄表所對應的所有data file的元數據,主要包括文件名,文件路徑,partition, schema,statistics,數據的索引等信息。
元數據信息會持久化保存在狀態存儲池裏面,為了降低對元數據庫的訪問壓力,對於訪問頻度高的元數據會進行緩存。元數據服務自身只負責處理對元數據的請求,自身是無狀態的,可以水平擴展。

安全管理

權限控制和安全管理,包括入侵檢測、用户角色管理、授權管理、訪問白名單管理、安全審計等功能。

計算層

通過容器編排平台(如 Kubernetes)來實現計算資源管理,所有計算資源都放在容器中。
計算組是計算資源的組織單位,可以將計算資源按需劃分為多個虛擬集羣。每個虛擬集羣裏包含0到多台計算節點,可按照實際資源需求量動態的擴縮容。計算節點主要承擔的是計算任務,這些任務可以是用户的查詢,也可以是一些後台任務。
用户查詢和這些後台任務,可以共享相同的計算節點以提高利用率,也可以使用獨立的計算節點以保證嚴格的資源隔離。
計算組是無狀態的,可以快速水平擴展。

存儲層

採用HDFS或S3等雲存儲服務作為數據存儲層。用來存儲實際數據、索引等內容。
數據表的數據文件存儲在遠端的統一分佈式存儲系統中,與計算節點分離開來。底層存儲系統可能會對應不同類型的分佈式系統。例如HDFS,Amazon S3, Google cloud storage,Azure blob storage,阿里雲對象存儲等等。底層存儲是天然支持高可用、容量是無限擴展的。
不同的分佈式存儲系統,例如S3和HDFS有很多不同的功能和不一樣的性能,會影響到我們的設計和實現。例如HDFS不支持文件的update, S3 object move操作時重操作需要複製數據等。
通過存儲的服務化,計算層可以支持ByteHouse自身的計算引擎之外,將來還可以便捷地對接其他計算引擎,例如Presto、Spark等。數據導入導出ByteHouse包括一個數據導入導出(Data Express)模塊,負責數據的導入導出工作。
圖片
Data Express模塊架構圖
Data Express 為數據導入/導出作業提供工作流服務和快速配置模板,用户可以從提供的快速模板創建數據加載作業。
DataExpress 利用 Spark 來執行數據遷移任務。
主要模塊:  

  • JobServer 
  • 導入模板
  • 導出模板
    JobServer 管理所有用户創建的數據遷移作業,同時運行外部事件觸發數據遷移任務。
    啓動任務時,JobServer 將相應的作業提交給 Spark 集羣,並監控其執行情況。作業執行狀態將保存在我們的元存儲中,以供 Bytehouse 進一步分析。ByteHouse支持離線數據導入和實時數據導入。

離線導入

離線導入

數據源:

  • Object Storage:S3、OSS、Minio
  • Hive (1.0+)Apache Kafka /Confluent Cloud/AWS Kinesis
  • 本地文件
  • RDS

離線導入

適用於希望將已準備好的數據一次性加載到 ByteHouse 的場景,根據是否對目標數據表進行分區,ByteHouse 提供了不同的加載模式:

  • 全量加載:全量將用最新的數據替換全表數據。
  • 增量加載:增量加載將根據其分區將新的數據添加到現有的目標數據表。
    ByteHouse 將替換現有分區,而非進行合併。
    支持的文件類型
  • ByteHouse的離線導入支持以下文件格式:
  • Delimited files (CSV, TSV, etc.)
  • Json (multiline)
  • Avro
  • ParquetExcel (xls)

實時導入

ByteHouse 能夠連接到 Kafka,並將數據持續傳輸到目標數據表中。與離線導入不同,Kafka 任務一旦啓動將持續運行。ByteHouse 的 Kafka 導入任務能夠提供 exactly-once 語義。您可以停止/恢復消費任務,ByteHouse 將記錄 offset 信息,確保數據不會丟失。
ByteHouse 在流式導入中支持以下消息格式:

  • Protobuf
  • JSON

總結

雲原生數據倉庫ByteHouse是一個具備極致性能、能夠存儲和計算資源分別按需擴縮容、功能豐富的數據分析產品,是一個面向海量數據、高實時要求的一個企業級OLAP數據引擎。ByteHouse在字節跳動的眾多場景中有着豐富的經驗積累,尤其是在實時數據分析場景和海量數據靈活查詢場景,都有超大規模的應用。ByteHouse基於自研技術優勢和超大規模的使用經驗,為企業大數據團隊帶來新的選擇和支持,以應對複雜多變的業務需求,高速增長的數據場景。目前,ByteHouse已在火山引擎上提供免費試用,歡迎大家來嘗試,併為我們提出寶貴建議。

立即跳轉火山引擎ByteHouse官網瞭解詳情!歡迎下載《從ClickHouse到ByteHouse》白皮書瞭解更多~

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.