轉載自:http://blog.csdn.net/colorant/article/details/8197913shell
==是什麼 ==編程
目標Scope(解決什麼問題)服務器
官方定義架構
Kiji的核心模塊是KijiSchema,按照官方的說法:KijiSchema provides a simple Java API for storing andmanaging typed data in HBase using Avro serializationapp
我的理解ide
整體感受就是構建在hadoop/hbase上的一層Wrapper,使用Avro存儲系列化的對象在HBase表中,基本上目的是讓應用程序的編寫者能更容易的用Hbase管理結構化的數據,而不是做爲一個扁平的表使用。拋開Hadoop和HBase,其最核心的部分就是所謂的Kiji-Schema,基本上就是用Avro處理Schema,以及讀寫系列化數據。工具
==如何實現 ==oop
kiji基本概念和與HBase的映射關係性能
kiji對HBase沒有作什麼改動,也沒有使用Coprocessor之類對HBase的功能進行拓展加強,因此基本上就是架構在HBase的公共API上,借用HBase既有的能力實現所需的功能,這一點和Hive On Hbase 有些相似。與Hive不一樣的是,kiji表的Metadata信息也是以HBase表的形式存在的。因此kiji的概念基本上均可以最終落實映射到HBase上ui
Entity:我的理解由於kiji的出發點是企圖強化對象概念,因此HBase表中Row的概念被弱化,每一個對象都用一個Entity來表示,對象的全部信息都存儲在一個Entity內部。實際上,Entityid對應於HBase的實現就是Row key。不過在存儲的時候,Entity ID能夠以Hash或裸數據或混合的形式存儲。
Cell:kiji中的數據單位劃分是Cell,是由 locality:family:key加上Timestamp來定位的,和HBase的Cell是同一個層次,可是爲何在定位中比HBase多了一層呢,實際上locality對應的是HBase的Family的概念,就是用來作同類數據的物理分組用途(改個名字難道是怕別人不理解HBase劃分Family的用意?)。而kiji中的family只是一個邏輯數據劃分的概念,並不對應HBase中的具體某個概念,能夠理解爲僅僅是把HBase的qualifier在命名的邏輯上分爲兩部分而已。
Layout:此外Kiji中還有Table Layout的概念,基本就是用來描述表的結構,Layout並無存儲在HTable的TableDescriptor中,而是在本身管理的meta表中存儲,在HBase上表現爲一個普通的HBaseTable(e.g. kiji.default.meta)
Schema:Kiji CellSchema對應的就是Avro的Schema,用來將扁平的HBase表格數據對象化。由於kiji的核心之一就是Schema,因此在Cell Schema方面仍是作了一些功夫的,Cell的內容能夠是裸的AvroRecord,Schema徹底由MetaTable決定,也能夠把Cell Schema和Avro Record合併存儲。而存儲的Schema爲了節省空間,能夠是Schema的Hash,也能夠是Schema的ID。對應的Full Schema的映射關係存儲在單獨的表中(e.g. kiji.default.schema_hash kiji.default.schema_id)
Mapping of Kiji conception to Hbase summary:
Items |
Kiji |
HBase |
Entity related |
Entity |
All KeyValues belong to the same row |
|
EntityID |
Row key |
Column related |
locality:family:key |
Family:qualifier |
|
locality |
Family |
|
Family:key |
Qualifier |
Schema related |
Table Layout |
KijiMetaTable on Hbase. e.g. kiji.default.meta |
|
Cell Schema |
Avro Schema saved together with Avro serialized data in KV |
|
Cell Schema mapping |
Schema Table on Hbase e.g. kiji.default.schema_hash, keji.default.schema_id |
Table讀寫操做相關
kiji的基本操做包括KijiTable的建立修改,以及Entity數據的讀寫。其操做的流程步驟和HBase的比較類似,也有許多對應的概念對象如Configuration/Admin/Table等,我的理解是由於kiji對數據模型並無本質的變革,只是封裝了一層wrapper操做,因此不可能也不須要在操做流程上有太大的差別。
Entity讀寫
數據的讀寫以Entity爲導向,實際上能夠理解爲就是以Row爲導向。一樣須要添加所操做的Family/column等。我的理解概念上的差別就是在對Entity的操做上時,Entity的全部完整內容都在一個對象內部,更接近面向對象的編程概念,也就是幫應用程序的做者作了一些封裝的工做,簡化開發者的工做量
Filter操做
Kiji提供了Row/column/value相關的幾個Filter,這個能夠說是Feature,也能夠說是爲了方便應用開發者的無奈之舉,由於row/column均可能以Hash的形式存在,而cellvalue則是Avro編碼過的,此外還可能附加有Schema,因此HBase相關的Filter沒法簡單的應用在Kiji table中工做。所以這些kiji Filter基本都是對HBase相關Filter的封裝,對應的都會有一個toHBaseFilter方法,用來在服務器端建立對應的HBaseFilter。
其它
Layout evolving
Kiji的重點既然是在Schema和Layout,在Layout的動態調整中也花了很多功夫,好比Layout,就分爲Concrete layout descriptors和Layout update descriptors。前者是做爲基礎,後者做爲修改量用來修正基礎Layout。這樣作的目的號稱是爲了減小Layout更新過程的Racecondition。沒有深刻研究其Evolving的細節,有須要時再研究。
對官方Feature的理解
Kiji官方描述了Kiji的一些Feature和精妙之處,結合文檔和API閱讀,我的理解以下:
kiji提供了schemashell工具幫助建立Kiji Table,支持DDL和JSON格式的輸入
所謂最佳實踐,我的理解以下:
其它還真沒看出有哪些最佳實踐
動態Schema和Avro序列化對象,這個是Kiji的出發點了
這個沒有什麼特殊的,我的理解就是支持Hbase client的Get Scan等操做,同時也提供了KijiTableInputFormat,KijiTableOutputFormat這樣的類來支持MapReduce操做,此外號稱對HBase自己的HTableInputFormat,HTableOutputFormat類做了Bug Fix
結構化對象化,老生重談
Why Kiji at all
整體感受Kiji的Design Goal如其所言,provides a simple Java API for storing and managing typed data inHBase using Avro serialization。基本上就是對HBase應用模式的一個封裝,用Avro來承載對象化的數據,方便Schema的演化。從數據的角度增強面向對象編程的概念(相對Hbase Table)。面對的是但願能使用HBase存儲數據,快速上手開發應用的用戶。在性能或結構上沒有本質的革新。能夠作爲一種HBase應用模式的參考,是否適用,應該還要看最終程序的需求。
==相關文獻 ==
User guide: http://docs.kiji.org/userguide/schema/1.0.0-rc1/kiji-schema-overview/
Kiji schema DDL : http://docs.kiji.org/userguide/schema/1.0.0-rc1/schema-shell-ddl-ref/