天天看點

Kudu:為大資料快速分析量身定制的 Hadoop 存儲系統

Kudu:為大資料快速分析量身定制的 Hadoop 存儲系統

apache hadoop提供了一系列資料存儲與處理的元件,覆寫了多種多樣、應用于企業級關鍵服務的使用者案例。在cloudera,我們一直在努力探索hadoop的各種可能性,拓展hadoop的邊界——使得hadoop更快、更好用、更安全。

自2012年,我們開啟了一個關于apache hadoop存儲系統的驗證工作(避免hadoop被限制在部分特定使用者案例中)。驗證過程中,我們發現了一些重要的發展趨勢并最終決定去開發一個新型的存儲系統,對hdfs與apache hbase提供的功能進行補充。現在,我們非常自豪地推出kudu,一個hadoop生态系統上的新生開源元件。kudu的目标是:

提供快速的全量資料分析與實時處理功能;

充分利用先進cpu與i/o資源;

支援資料更新;

簡單、可擴充的資料模型

在這裡,我們會對打造kudu的動機、kudu架構等給出簡單的介紹。

功能上的空白

在很多cloudera的客戶環境中,我們發現了“混合架構 (hybrid architecture)”的趨勢,即很多hadoop工具會被同時部署。hbase主要被用于支撐資料導入,(及其)快速的小查詢執行,更重要的是支援資料的随機修改。而hdfs與impala組合的使用可以高效處理列式存儲資料(例如apache parquet),在大規模資料集上提供高性能的分析型查詢。

目前,大部分客戶都被迫去打造一個混合式的架構,将多個工具內建在一起進行使用。客戶首先選擇一種存儲系統導入、更新資料,但是後續為了最優化分析型報表的生成就得轉向采用另一種存儲系統。雖然我們的客戶已經成功地部署、維護了這樣的混合架構,但是我們相信,如果一個存儲系統能夠為多種不同類型的工作負載提供高性能的處理能力,那麼對于那種需要使用混合架構才能解決的問題将是更加優雅的解決方案。

新的硬體

另一個我們在客戶現場發現的趨勢是硬體能力的不斷加強。首先是記憶體的增長,從32gb到2012年的128gb到如今的256gb。然後是磁盤,現在在很多普通伺服器中ssd的應用也是屢見不鮮。hbase、hdfs、以及其他的hadoop工具通過調整、更新也在不斷适應更新換代的硬體,但是這些系統在當初設計時叢集的瓶頸在于底層磁盤的速度。最優化磁盤存儲架構的設計對于現代架構(大量資料可以緩存在記憶體中,永久存儲層資料的随機通路速度是原來的100多倍)就未必是最優的。

另外,随着存儲層資料通路速度的不斷增長,整個系統性能的瓶頸反而轉向了cpu。當存儲層越來越快,cpu效率變得愈發關鍵。

kudu簡介

為了應對先前發現的這些趨勢,有兩種不同的方式:持續更新現有的hadoop工具或者重新設計開發一個新的元件。其目标是:

對資料掃描(scan)和随機通路(random access)同時具有高性能,簡化使用者複雜的混合架構;

高cpu效率,最大化先進處理器的效能;

高io性能,充分利用先進永久存儲媒體;

支援資料的原地更新,避免額外的資料處理、資料移動

我們為了實作這些目标,首先在現有的開源項目上實作原型,但是最終我們得出結論:需要從架構層作出重大改變。而這些改變足以讓我們重新開發一個全新的資料存儲系統。于是3年前開始開發,直到如今我們終于可以分享多年來的努力成果:kudu,一個新的資料存儲系統。

kudu設計

從使用者的角度而言,kudu是用于存儲結構化資料的(tables)。表,具有一個定義明确的表結構(schema)包含一組預先定義的列。每個表具有一個主鍵(primary key),由一到多個列所組成。主鍵強加了資料唯一性的限制,同時也像索引一樣可以加速資料的更新和删除。

kudu表包含了一系列邏輯資料子集(tablets),跟如同傳統資料庫系統的分區(partition)。kudu原生提供資料可用性支援,通過将tablets複制到不同機器的方式(raft consensus算法)處理硬體錯誤帶來的資料不可通路問題。每個tablets的大小一般在幾十個gb左右,一個獨立的伺服器節點一般可以為10—100個tablets提供服務。

kudu采用master背景程序管理中繼資料(就像是目錄catalog,描述資料的邏輯結構)、在硬體錯誤恢複時實作排程(coordinator)以及記錄每個tablet伺服器上tablets的狀态等。kudu使用多個master背景程序以提供管理節點的高可用性。kudu實作了raft consensus算法,是以很多master程序的功能都可以通過tablet伺服器實作,在未來的發展路線圖中,master的職責也會被分散到不同的機器上。另外,kudu的master背景程序不會成為整個叢集性能的瓶頸,根據在250節點叢集的測試中,master背景程序完全沒有性能的問題。

存儲于kudu的資料是可修改的(利用log-structured變種算法)。更新、插入、删除都是臨時先緩沖于記憶體,随後合并進永久性列式存儲中。kudu為了保證查詢延遲不出現大的波動,也會周期性地進行小型維護操作,比如compaction。

kudu提供了c++、java api支援點操作與批操作。kudu的另一個目标是與現有的hadoop生态系統工具進行內建。目前,kudu的beta版本已經與impala、mapreduce以及apache spark實作了整合。随着時間的推移,我們計劃将kudu內建到整個hadoop生态系統中。