『壹』 hbase列式資料庫四維坐標是什麼
實際上,HBase是一個列族資料庫,而不是真正的列式資料庫。
因為允許存放非結構化數據,所以HBase的數據類型只有簡單的字元串類型,如果需要細分類型,需要用戶自己處理。
HBase的四維模型中每個元素:
(1)行鍵(Row Key):最大長度為64KB的任意字元串。與關系型資料庫一樣,行鍵是行的唯一標志。
(2)列族(Column Family):這是理解列族資料庫的關鍵概念。將數據行中的欄位按照某種要求分成數個小組,每個小組包含若干個欄位,每個小組就是列族。列族需要預先定義,並且不能隨意修改。每行具有相同的列族,但不要求每個列族都存儲數據。
(3)列限定符(Qualifier):每個列族包含多個欄位,限定符用於區分不同的欄位。列限定符不需要預先定義,因此每行可以有不同數量的列限定符,也可以認為列限定符就是欄位。
(4)單元(Cell):存儲數據的最小單元。單元中存儲的是未經解釋的字元串,需要通過行鍵、列族、列限定符、時間戳進行定位。
(5)版本(Version):這是HBase與其他資料庫的不同之處。版本是一個64位整型數,可以由系統自動生成,也可以由用戶自定義。引入版本後,存儲在單元中的值不再只有一個,可以通過不同的時間戳(Timestamp)在同一單元中存入多個版本。
『貳』 nosql資料庫的四種類型
一般將NoSQL資料庫分為四大類:鍵值(Key-Value)存儲資料庫、列存儲資料庫、文檔型資料庫和圖形(Graph)資料庫。它們的數據模型、優缺點、典型應用場景。
鍵值(Key-Value)存儲資料庫Key指向Value的鍵值對,通常用hash表來實現查找速度快數據無結構化(通常只被當作字元串或者二進制數據)內容緩存,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等。
列存儲資料庫,以列簇式存儲,將同一列數據存在一起查找速度快,可擴展性強,更容易進行分布式擴展功能相對局限分布式的文件系統。
文檔型資料庫,Key-Value對應的鍵值對,Value為結構化數據,數據結構要求不嚴格,表結構可變(不需要像關系型資料庫一樣需預先定義表結構),查詢性能不高,而且缺乏統一的查詢語法,Web應用。
圖形(Graph)資料庫,圖結構,利用圖結構相關演算法(如最短路徑定址,N度關系查找等),很多時候需要對整個圖做計算才能得出需要的信息,而且這種結構不太好做分布式的集群方案,社交網路,推薦系統等。
『叄』 為什麼說hbase是一個面向列的資料庫
在說HBase之前,我想再嘮叨幾句。做互聯網應用的哥們兒應該都清楚,互聯網應用這東西,你沒辦法預測你的系統什麼時候會被多少人訪問,你面臨的用戶到底有多少,說不定今天你的用戶還少,明天系統用戶就變多了,結果您的系統應付不過來了了,不幹了,這豈不是咱哥幾個的悲哀,說時髦點就叫「杯具啊」。
其實說白了,這些就是事先沒有認清楚互聯網應用什麼才是最重要的。從系統架構的角度來說,互聯網應用更加看重系統性能以及伸縮性,而傳統企業級應用都是比較看重數據完整性和數據安全性。那麼我們就來說說互聯網應用伸縮性這事兒.對於伸縮性這事兒,哥們兒我也寫了幾篇博文,想看的兄弟可以參考我以前的博文,對於web server,app server的伸縮性,我在這里先不說了,因為這部分的伸縮性相對來說比較容易一點,我主要來回顧一些一個慢慢變大的互聯網應用如何應對資料庫這一層的伸縮。
首先剛開始,人不多,壓力也不大,搞一台資料庫伺服器就搞定了,此時所有的東東都塞進一個Server里,包括web server,app server,db server,但是隨著人越來越多,系統壓力越來越多,這個時候可能你把web server,app server和db server分離了,好歹這樣可以應付一陣子,但是隨著用戶量的不斷增加,你會發現,資料庫這哥們不行了,速度老慢了,有時候還會宕掉,所以這個時候,你得給資料庫這哥們找幾個伴,這個時候Master-Salve就出現了,這個時候有一個Master Server專門負責接收寫操作,另外的幾個Salve Server專門進行讀取,這樣Master這哥們終於不抱怨了,總算讀寫分離了,壓力總算輕點了,這個時候其實主要是對讀取操作進行了水平擴張,通過增加多個Salve來克服查詢時CPU瓶頸。一般這樣下來,你的系統可以應付一定的壓力,但是隨著用戶數量的增多,壓力的不斷增加,你會發現Master server這哥們的寫壓力還是變的太大,沒辦法,這個時候怎麼辦呢?你就得切分啊,俗話說「只有切分了,才會有伸縮性嘛」,所以啊,這個時候只能分庫了,這也是我們常說的資料庫「垂直切分」,比如將一些不關聯的數據存放到不同的庫中,分開部署,這樣終於可以帶走一部分的讀取和寫入壓力了,Master又可以輕松一點了,但是隨著數據的不斷增多,你的資料庫表中的數據又變的非常的大,這樣查詢效率非常低,這個時候就需要進行「水平分區」了,比如通過將User表中的數據按照10W來劃分,這樣每張表不會超過10W了。
綜上所述,一般一個流行的web站點都會經歷一個從單台DB,到主從復制,到垂直分區再到水平分區的痛苦的過程。其實資料庫切分這事兒,看起來原理貌似很簡單,如果真正做起來,我想凡是sharding過資料庫的哥們兒都深受其苦啊。對於資料庫伸縮的文章,哥們兒可以看看後面的參考資料介紹。
好了,從上面的那一堆廢話中,我們也發現資料庫存儲水平擴張scale out是多麼痛苦的一件事情,不過幸好技術在進步,業界的其它弟兄也在努力,09年這一年出現了非常多的NoSQL資料庫,更准確的應該說是No relation資料庫,這些資料庫多數都會對非結構化的數據提供透明的水平擴張能力,大大減輕了哥們兒設計時候的壓力。下面我就拿Hbase這分布式列存儲系統來說說。
一 Hbase是個啥東東?
在說Hase是個啥傢伙之前,首先我們來看看兩個概念,面向行存儲和面向列存儲。面向行存儲,我相信大夥兒應該都清楚,我們熟悉的RDBMS就是此種類型的,面向行存儲的資料庫主要適合於事務性要求嚴格場合,或者說面向行存儲的存儲系統適合OLTP,但是根據CAP理論,傳統的RDBMS,為了實現強一致性,通過嚴格的ACID事務來進行同步,這就造成了系統的可用性和伸縮性方面大大折扣,而目前的很多NoSQL產品,包括Hbase,它們都是一種最終一致性的系統,它們為了高的可用性犧牲了一部分的一致性。好像,我上面說了面向列存儲,那麼到底什麼是面向列存儲呢?Hbase,Casandra,Bigtable都屬於面向列存儲的分布式存儲系統。看到這里,如果您不明白Hbase是個啥東東,不要緊,我再總結一下下:
Hbase是一個面向列存儲的分布式存儲系統,它的優點在於可以實現高性能的並發讀寫操作,同時Hbase還會對數據進行透明的切分,這樣就使得存儲本身具有了水平伸縮性。
二 Hbase數據模型
HBase,Cassandra的數據模型非常類似,他們的思想都是來源於Google的Bigtable,因此這三者的數據模型非常類似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我沒發現。好了,廢話少說,我們來看看Hbase的數據模型到底是個啥東東。
在Hbase裡面有以下兩個主要的概念,Row key,Column Family,我們首先來看看Column family,Column family中文又名「列族」,Column family是在系統啟動之前預先定義好的,每一個Column Family都可以根據「限定符」有多個column.下面我們來舉個例子就會非常的清晰了。
假如系統中有一個User表,如果按照傳統的RDBMS的話,User表中的列是固定的,比如schema 定義了name,age,sex等屬性,User的屬性是不能動態增加的。但是如果採用列存儲系統,比如Hbase,那麼我們可以定義User表,然後定義info 列族,User的數據可以分為:info:name = zhangsan,info:age=30,info:sex=male等,如果後來你又想增加另外的屬性,這樣很方便只需要info:newProperty就可以了。
也許前面的這個例子還不夠清晰,我們再舉個例子來解釋一下,熟悉SNS的朋友,應該都知道有好友Feed,一般設計Feed,我們都是按照「某人在某時做了標題為某某的事情」,但是同時一般我們也會預留一下關鍵字,比如有時候feed也許需要url,feed需要image屬性等,這樣來說,feed本身的屬性是不確定的,因此如果採用傳統的關系資料庫將非常麻煩,況且關系資料庫會造成一些為null的單元浪費,而列存儲就不會出現這個問題,在Hbase里,如果每一個column 單元沒有值,那麼是佔用空間的。下面我們通過兩張圖來形象的表示這種關系:
上圖是傳統的RDBMS設計的Feed表,我們可以看出feed有多少列是固定的,不能增加,並且為null的列浪費了空間。但是我們再看看下圖,下圖為Hbase,Cassandra,Bigtable的數據模型圖,從下圖可以看出,Feed表的列可以動態的增加,並且為空的列是不存儲的,這就大大節約了空間,關鍵是Feed這東西隨著系統的運行,各種各樣的Feed會出現,我們事先沒辦法預測有多少種Feed,那麼我們也就沒有辦法確定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基於列存儲的數據模型就非常適合此場景。說到這里,採用Hbase的這種方式,還有一個非常重要的好處就是Feed會自動切分,當Feed表中的數據超過某一個閥值以後,Hbase會自動為我們切分數據,這樣的話,查詢就具有了伸縮性,而再加上Hbase的弱事務性的特性,對Hbase的寫入操作也將變得非常快。
上面說了Column family,那麼我之前說的Row key是啥東東,其實你可以理解row key為RDBMS中的某一個行的主鍵,但是因為Hbase不支持條件查詢以及Order by等查詢,因此Row key的設計就要根據你系統的查詢需求來設計了額。我還拿剛才那個Feed的列子來說,我們一般是查詢某個人最新的一些Feed,因此我們Feed的Row key可以有以下三個部分構成<userId><timestamp><feedId>,這樣以來當我們要查詢某個人的最進的Feed就可以指定Start Rowkey為<userId><0><0>,End Rowkey為<userId><Long.MAX_VALUE><Long.MAX_VALUE>來查詢了,同時因為Hbase中的記錄是按照rowkey來排序的,這樣就使得查詢變得非常快。
三 Hbase的優缺點
1 列的可以動態增加,並且列為空就不存儲數據,節省存儲空間.
2 Hbase自動切分數據,使得數據存儲自動具有水平scalability.
3 Hbase可以提供高並發讀寫操作的支持
Hbase的缺點:
1 不能支持條件查詢,只支持按照Row key來查詢.
2 暫時不能支持Master server的故障切換,當Master宕機後,整個存儲系統就會掛掉.
四.補充
1.數據類型,HBase只有簡單的字元類型,所有的類型都是交由用戶自己處理,它只保存字元串。而關系資料庫有豐富的類型和存儲方式。
2.數據操作:HBase只有很簡單的插入、查詢、刪除、清空等操作,表和表之間是分離的,沒有復雜的表和表之間的關系,而傳統資料庫通常有各式各樣的函數和連接操作。
3.存儲模式:HBase是基於列存儲的,每個列族都由幾個文件保存,不同的列族的文件時分離的。而傳統的關系型資料庫是基於表格結構和行模式保存的
4.數據維護,HBase的更新操作不應該叫更新,它實際上是插入了新的數據,而傳統資料庫是替換修改
5.可伸縮性,Hbase這類分布式資料庫就是為了這個目的而開發出來的,所以它能夠輕松增加或減少硬體的數量,並且對錯誤的兼容性比較高。而傳統資料庫通常需要增加中間層才能實現類似的功能
『肆』 Hbase的特性有哪些
HBase不是一個關系型資料庫,它需要不同的方法定義你的數據模型,HBase實際上定義了一個四維數據模型,下面就是每一維度的定義:
行鍵:每行都有唯一的行鍵,行鍵沒有數據類型,它內部被認為是一個位元組數組。
列簇:數據在行中被組織成列簇,每行有相同的列簇,但是在行之間,相同的列簇不需要有相同的列修飾符。在引擎中,HBase將列簇存儲在它自己的數據文件中,所以,它們需要事先被定義,此外,改變列簇並不容易。
列修飾符:列簇定義真實的列,被稱之為列修飾符,你可以認為列修飾符就是列本身。
版本:每列都可以有一個可配置的版本數量,你可以通過列修飾符的制定版本獲取數據。