Apache Hadoop提供了一系列數(shù)據(jù)存儲與處理的組件,覆蓋了多種多樣、應(yīng)用于企業(yè)級關(guān)鍵服務(wù)的用戶案例。在Cloudera,我們一直在努力探索Hadoop的各種可能性,拓展Hadoop的邊界——使得Hadoop更快、更好用、更安全。
自2012年,我們開啟了一個關(guān)于Apache Hadoop存儲系統(tǒng)的驗(yàn)證工作(避免Hadoop被約束在部分特定用戶案例中)。驗(yàn)證過程中,我們發(fā)現(xiàn)了一些重要的發(fā)展趨勢并最終決定去開發(fā)一個新型的存儲系統(tǒng),對HDFS與Apache HBase提供的功能進(jìn)行補(bǔ)充?,F(xiàn)在,我們非常自豪地推出Kudu,一個Hadoop生態(tài)系統(tǒng)上的新生開源組件。Kudu的目標(biāo)是:
提供快速的全量數(shù)據(jù)分析與實(shí)時(shí)處理功能;
充分利用先進(jìn)CPU與I/O資源;
支持?jǐn)?shù)據(jù)更新;
簡單、可擴(kuò)展的數(shù)據(jù)模型
在這里,我們會對打造Kudu的動機(jī)、Kudu架構(gòu)等給出簡單的介紹。
功能上的空白在很多Cloudera的客戶環(huán)境中,我們發(fā)現(xiàn)了“混合架構(gòu) (hybrid architecture)”的趨勢,即很多Hadoop工具會被同時(shí)部署。HBase主要被用于支撐數(shù)據(jù)導(dǎo)入,(及其)快速的小查詢執(zhí)行,更重要的是支持?jǐn)?shù)據(jù)的隨機(jī)修改。而HDFS與Impala組合的使用可以高效處理列式存儲數(shù)據(jù)(例如Apache Parquet),在大規(guī)模數(shù)據(jù)集上提供高性能的分析型查詢。
目前,大部分客戶都被迫去打造一個混合式的架構(gòu),將多個工具集成在一起進(jìn)行使用??蛻羰紫冗x擇一種存儲系統(tǒng)導(dǎo)入、更新數(shù)據(jù),但是后續(xù)為了最優(yōu)化分析型報(bào)表的生成就得轉(zhuǎn)向采用另一種存儲系統(tǒng)。雖然我們的客戶已經(jīng)成功地部署、維護(hù)了這樣的混合架構(gòu),但是我們相信,如果一個存儲系統(tǒng)能夠?yàn)槎喾N不同類型的工作負(fù)載提供高性能的處理能力,那么對于那種需要使用混合架構(gòu)才能解決的問題將是更加優(yōu)雅的解決方案。
新的硬件另一個我們在客戶現(xiàn)場發(fā)現(xiàn)的趨勢是硬件能力的不斷加強(qiáng)。首先是內(nèi)存的增長,從32GB到2012年的128GB到如今的256GB。然后是磁盤,現(xiàn)在在很多普通服務(wù)器中SSD的應(yīng)用也是屢見不鮮。HBase、HDFS、以及其他的Hadoop工具通過調(diào)整、升級也在不斷適應(yīng)更新?lián)Q代的硬件,但是這些系統(tǒng)在當(dāng)初設(shè)計(jì)時(shí)集群的瓶頸在于底層磁盤的速度。最優(yōu)化磁盤存儲架構(gòu)的設(shè)計(jì)對于現(xiàn)代架構(gòu)(大量數(shù)據(jù)可以緩存在內(nèi)存中,永久存儲層數(shù)據(jù)的隨機(jī)訪問速度是原來的100多倍)就未必是最優(yōu)的。
另外,隨著存儲層數(shù)據(jù)訪問速度的不斷增長,整個系統(tǒng)性能的瓶頸反而轉(zhuǎn)向了CPU。當(dāng)存儲層越來越快,CPU效率變得愈發(fā)關(guān)鍵。
Kudu簡介為了應(yīng)對先前發(fā)現(xiàn)的這些趨勢,有兩種不同的方式:持續(xù)更新現(xiàn)有的Hadoop工具或者重新設(shè)計(jì)開發(fā)一個新的組件。其目標(biāo)是:
對數(shù)據(jù)掃描(scan)和隨機(jī)訪問(random access)同時(shí)具有高性能,簡化用戶復(fù)雜的混合架構(gòu);
高CPU效率,最大化先進(jìn)處理器的效能;
高IO性能,充分利用先進(jìn)永久存儲介質(zhì);
支持?jǐn)?shù)據(jù)的原地更新,避免額外的數(shù)據(jù)處理、數(shù)據(jù)移動
我們?yōu)榱藢?shí)現(xiàn)這些目標(biāo),首先在現(xiàn)有的開源項(xiàng)目上實(shí)現(xiàn)原型,但是最終我們得出結(jié)論:需要從架構(gòu)層作出重大改變。而這些改變足以讓我們重新開發(fā)一個全新的數(shù)據(jù)存儲系統(tǒng)。于是3年前開始開發(fā),直到如今我們終于可以分享多年來的努力成果:Kudu,一個新的數(shù)據(jù)存儲系統(tǒng)。
Kudu設(shè)計(jì)從用戶的角度而言,Kudu是用于存儲結(jié)構(gòu)化數(shù)據(jù)的(tables)。表,具有一個定義明確的表結(jié)構(gòu)(schema)包含一組預(yù)先定義的列。每個表具有一個主鍵(primary key),由一到多個列所組成。主鍵強(qiáng)加了數(shù)據(jù)唯一性的約束,同時(shí)也像索引一樣可以加速數(shù)據(jù)的更新和刪除。
Kudu表包含了一系列邏輯數(shù)據(jù)子集(Tablets),跟如同傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的分區(qū)(Partition)。Kudu原生提供數(shù)據(jù)可用性支持,通過將Tablets復(fù)制到不同機(jī)器的方式(Raft consensus算法)處理硬件錯誤帶來的數(shù)據(jù)不可訪問問題。每個Tablets的大小一般在幾十個GB左右,一個獨(dú)立的服務(wù)器節(jié)點(diǎn)一般可以為10—100個Tablets提供服務(wù)。
Kudu采用master后臺進(jìn)程管理元數(shù)據(jù)(就像是目錄catalog,描述數(shù)據(jù)的邏輯結(jié)構(gòu))、在硬件錯誤恢復(fù)時(shí)實(shí)現(xiàn)調(diào)度(coordinator)以及記錄每個tablet服務(wù)器上tablets的狀態(tài)等。Kudu使用多個master后臺進(jìn)程以提供管理節(jié)點(diǎn)的高可用性。Kudu實(shí)現(xiàn)了Raft Consensus算法,因此很多master進(jìn)程的功能都可以通過Tablet服務(wù)器實(shí)現(xiàn),在未來的發(fā)展路線圖中,master的職責(zé)也會被分散到不同的機(jī)器上。另外,Kudu的master后臺進(jìn)程不會成為整個集群性能的瓶頸,根據(jù)在250節(jié)點(diǎn)集群的測試中,master后臺進(jìn)程完全沒有性能的問題。
存儲于Kudu的數(shù)據(jù)是可修改的(利用log-structured變種算法)。更新、插入、刪除都是臨時(shí)先緩沖于內(nèi)存,隨后合并進(jìn)永久性列式存儲中。Kudu為了保證查詢延遲不出現(xiàn)大的波動,也會周期性地進(jìn)行小型維護(hù)操作,比如compaction。
Kudu提供了C++、Java API支持點(diǎn)操作與批操作。Kudu的另一個目標(biāo)是與現(xiàn)有的Hadoop生態(tài)系統(tǒng)工具進(jìn)行集成。目前,Kudu的Beta版本已經(jīng)與Impala、MapReduce以及Apache Spark實(shí)現(xiàn)了整合。隨著時(shí)間的推移,我們計(jì)劃將Kudu集成到整個Hadoop生態(tài)系統(tǒng)中。