標籤:
#????????????Kudu:Storage?for?Fast?Analytics?on?Fast?Data
##?Abstract
??kudu?是一個用於儲存結構化資料的開源儲存引擎,它支援低延遲的隨機訪問及高效的分析訪問模式。kudu採用水平資料分割的方式對資料分布到叢集中,使用Raft一致性協議複製每個分區,提供較低的平均恢復and?low?tail?latencies.?kudu在hadoop生態圈的背景下所設計的,它支援通過Cloudera?Impala,Apache?Spark,MapRedure等多種工具的訪問模式。
##?1?Introduction
最近幾年,所產生的資料爆炸式增長,一些開源技術在企業中快速地得到應用,這些技術具有儲存大量的資料能力,同時具有低成本、可擴充性的特點。對於"big?data"工作負載,Hadoop生態系統已經成為了一個焦點,因為許多傳統的資料庫系統難以提供較好的可擴充性。
對於結構化的資料的儲存,在hadoop生態圈中典型地通過兩種方式實現:對於靜態資料集,資料通常使用以Apache?Avro或Apache?Parquet等位元據格式儲存在HDFS上。然而,無論是HDFS還是這些格式都沒有提供對單條記錄的更新或者提供高效的隨機訪問的能力。對於易變的資料通常儲存在Apache?HBase或Apache?Cassandra等半結構化儲存引擎中。這些儲存系統提供對記錄進行低延遲的讀寫,但是對於基於SQL的分析或機器學習這些應用來說,這些儲存引擎相較於靜態檔案格式而言並不能提供較好的順序輸送量。
待用資料在HDFS上提供的分析效能與HBase和Cassandra提供的行級高效隨機訪問能力之間儲存一條鴻溝。如果在單個應用中同時需要這兩種能力,那麼開發人員不得不開發非常複雜的架構。尤其是,對於許多Cloudera的客戶have?deveplped?data?pipelines?which?involve?streaming?ingest?and?updates?in?HBase,隨後將資料周期地匯入到Parquet用於分析。這種架構具有如下缺點:
*?應用必須編寫較複雜的代碼去管理資料在兩種系統中的流動及同步
*?操作者需要誇多個不同的系統管理一致性的備份,安全性原則,監視。
*?The?resulting?architecture?may?exhibit?significant?lag?between?the?arrival?of?new?data?into?the?HBase?“staging?area”?and?the?time?when?the?new?data?is?available?for?analytics.
*?In?the?real?world,?systems?often?need?to?accomodate?latearriving?data,?corrections?on?past?records,?or?privacyrelated?deletions?on?data?that?has?already?been?migrated?to?the?immutable?store.?Achieving?this?may?involve?expensive?rewriting?and?swapping?of?partitions?and?manual?intervention.
kudu是一種新的儲存引擎,它徹底填補了HDFS順序訪問的高吞吐與HBase或Cassandra低延時隨機訪問之間的鴻溝。然而這些已存在的系統能夠繼續在某些情形下擁有優勢。kudu提供了一個?"happy?medium"的選擇,可以讓許多workloads的架構顯著地簡化。尤其,Kudu提供了簡單的API,可以對行級資料進行insert,updates,delete,同時提供對錶進行效地掃描,其輸送量與Parquet相當。
??
這篇文章介紹了kudu的架構,第2部分站在使用者的角度對系統進行了描述。介紹了資料模型,APIs及操作視圖結構。第3部分描述了kudu的架構,包括資料的分區方式、資料在節點之間的複製、錯誤恢複及執行一般的操作。第4部分介紹kudu如何在磁碟上儲存資料,並提供高效的隨機訪問和分析效能。第5部分討論了kudu與Hadoop生態系統中的其它系統的整合。第6部分展示了在綜合workloads上的初步效能結果。
?
##?2?Kudu?at?a?high?level
###?2.1?Tables?and?schemas
從使用者的角度來說,kudu是一個用於儲存結構化資料表的儲存系統。一個kudu叢集可以有多張tables,每個tables有一個定義好的schema,shchema由明確數量的列組成。每列有一個列名,類型(eg.INT32?or?STRING)及可選的非空屬性。一些被排序的列子集作為tables的primary?key。primary?key要求具有唯一性。primary?key作為僅有的索引,通過索引可以對進行高效地講更新和刪除操作。kudu的資料模型非常類似於關係型資料庫,但是不同於許多其它的分布式儲存系統,比如Cassandra,MongoDB,Riak,BigTable等。
和關係型資料庫一樣,使用者在建立table時必須定義表的schema。試圖對未定義的列插入資料或者違背primary?key唯一性限制都將導致錯誤的結果。使用者隨時都可以通過*alter?table*?命令增加或刪除列,但是primary?key不能被刪除。
我們決定顯示指定列的類型而不是使用NoSQL-style?“everythin?is?bytes",其原因主要有以下兩點:
*?Explicit?types?allow?us?to?use?type-specific?columnar?encodings?such?as?bit-packing?for?integers.
*?Explicit?types?allow?us?to?expose?SQL-like?metadata?to?other?systems?such?as?commonly?used?business?intelligence?or?data?exploration?tools
與大多數關係型資料庫不同的是:kudu當前並不支援二級索引,除primary?key外,其它列並沒有提供唯一性限制。目前,kudu要求每個table有一個primary?key,當然我們期望將來的版本能夠自動產生迭代的keys.
??
??
來自為知筆記(Wiz)
kudu論文閱讀