HBase與傳統關系資料庫的區別主要體現在以下幾個方面:1.數據類型。關系資料庫採用關系模型,具有豐富的數據類型和儲存方式。HBase則採用了更加簡單的數據模型,它把數據儲存為未經解釋的字元串,用戶可以把不同格式的結構化數據和非結構化數據都序列化成字元串保存到HBase中,用戶需要自己編寫程序把字元串解析成不同的數據類型。 2.數據操作。關系資料庫中包含了豐富的操作,如插入、刪除、更新、查詢等,其中會涉及復雜的多表連接,通常是藉助多個表之間的主外鍵關聯來實現的。HBase操作則不存在復雜的表與表之間的關系,只有簡單的插入、查詢、刪除、清空等,因為HBase在設計上就避免了復雜的表與表之。
列存儲不同於傳統的關系型資料庫,其數據在表中是按行存儲的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。
按列存儲每個欄位的數據聚集存儲,在查詢只需要少數幾個欄位的時候,能大大減少讀取的數據量,一個欄位的數據聚集存儲,那就更容易為這種聚集存儲設計更好的壓縮/解壓演算法。
傳統的(Oracle)行存儲和(Hbase)列存儲的區別。
主要體現在以下幾個方面:1.數據類型。關系資料庫採用關系模型,具有豐富的數據類型和儲存方式。HBase則採用了更加簡單的數據模型,它把數據儲存為未經解釋的字元串,用戶可以把不同格式的結構化數據和非結構化數據都序列化成字元串保存到HBase中,用戶需要自己編寫程序把字元串解析成不同的數據類型。 2.數據操作。關系資料庫中包含了豐富的操作,如插入、刪除、更新、查詢等,其中會涉及復雜的多表連接,通常是藉助多個表之間的主外鍵關聯來實現的。HBase操作則不存在復雜的表與表之間的關系,只有簡單的插入、查詢、刪除、清空等,因為HBase在設計上就避免了復雜的表與表之間的關系,通常只採用單表的主鍵查詢。
B. HBase數據結構是什麼
RowKey
與nosql資料庫們一樣,RowKey是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
通過單個RowKey訪問(get)
通過RowKey的range(正則)(like)
全表掃描(scan)
RowKey行鍵 (RowKey)可以是任意字元串(最大長度是64KB,實際應用中長度一般為 10-100bytes),在HBASE內部,RowKey保存為位元組數組。存儲時,數據按照RowKey的字典序(byte order)排序存儲。設計RowKey時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)Table:表,所有的表都是命名空間的成員,即表必屬於某個命名空間,如果沒有指定,則在default默認的命名空間中。
RegionServer group:一個命名空間包含了默認的RegionServer Group。
Permission:許可權,命名空間能夠讓我們來定義訪問控制列表ACL(Access Control List)。例如,創建表,讀取表,刪除,更新等等操作。
Quota:限額,可以強制一個命名空間可包含的region的數量。
Column Family
列族:HBASE表中的每個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如 courses:history,courses:math都屬於courses 這個列族。
Cell
由{rowkey, column Family:columu, version} 唯一確定的單元。cell中的數據是沒有類型的,全部是位元組碼形式存貯。
關鍵字:無類型、位元組碼
Time Stamp
HBASE 中通過rowkey和columns確定的為一個存貯單元稱為cell。每個 cell都保存 著同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒 的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版 本沖突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,HBASE提供 了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段 時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
命名空間
命名空間的結構:
C. hbase資料庫存儲的特點有哪些
特點:(1)大:一個表可以有數十億行,上百萬列;
(2)無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
(3)面向列:面向列(族)的存儲和許可權控制,列(族)獨立檢索;?
(4)稀疏:空(null)列並不佔用存儲空間,表可以設計的非常稀疏;
(5)數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
(6)數據類型單一:Hbase中的數據都是字元串,沒有類型。
D. 為什麼說hbase是一個面向列的資料庫
在說HBase之前,我想再嘮叨幾句。做互聯網應用的哥們兒應該都清楚,互聯網應用這東西,你沒辦法預測你的系統什麼時候會被多少人訪問,你面臨的用戶到底有多少,說不定今天你的用戶還少,明天系統用戶就變多了,結果您的系統應付不過來了橡睜了,不幹了,這豈不是咱哥幾個的悲哀,說時髦點就叫「杯具啊」。x0dx0ax0dx0a其實說白了,這些就是事先沒有認清楚互聯網應用什麼才是最重要的。從系統架構的角度來說,互聯網應用更加看重系統性能以及伸縮性,而傳統企業級應用都是比較看重數據完整性和數據安全性。那麼我們就來說說互聯網應用伸縮性這事兒.對於伸縮性這事兒,哥們兒我也寫了幾篇博文,想看的兄弟可以參考我以前的博文,對於web server,app server的伸縮性,我在這里先不說了,因為這部分的伸縮性相對來說比較容易一點,我主要來回顧一些一個慢慢變大的互聯網應用如何應對資料庫這一層的伸縮。x0dx0ax0dx0a首先剛開始,人不多,壓力也不大,搞一台資料庫伺服器就搞定了,此時所有的東東都塞進一個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了。x0dx0ax0dx0a綜上所述,一般一個流行的web站點都會經歷一個從單台DB,到主從復制,到垂直分區再到水平分區的痛苦的過程。其實資料庫切分這事兒,看起來原理貌似很簡單,如果真正做起來,我想凡是sharding過資料庫的哥們兒都深受其苦啊。對於資料庫伸縮的文章,哥們兒可以看看後面的參考資料介紹。x0dx0ax0dx0a好了,從上面的那一堆廢話中,我們也發現資料庫存儲水平擴張scale out是多麼痛苦的一件事情,不過幸好技術在進步,業界的其它弟兄也在努力,09年這一年出現了非常多的NoSQL資料庫,更准確的應該說是No relation資料庫,這些資料庫多數都會對非結構化的數據提供透明的水平擴張能力,大大減輕了哥們兒設計時候的壓力。下面我就拿Hbase這分布式列存儲系統來說說。x0dx0ax0dx0a一 Hbase是個啥東東? x0dx0a在說Hase是個啥傢伙之前,首先我們來看看兩個概念,面向行存儲和面向列存儲。面向行存儲,我相信大夥兒應該都清楚,我們閉正熟悉的RDBMS就是此種類型的,面向行存儲的資料庫主要適合於事務性要求嚴格場合,或者說面向行存儲的存儲系統適合OLTP,但是根據CAP理論,傳統的RDBMS,為了實現強一致性,通過嚴格的ACID事務來進行同步,這就造成了系統的可用性和伸縮性方面大大折扣,而目前的很多NoSQL產品,包括Hbase,它們都是一種最終一致性的系統,它們為了高的可用性犧牲了一部分的一致性。好像,我上面說了面向列存儲,那麼到底什麼是面向列存儲呢?Hbase,Casandra,Bigtable都屬於面向列存儲的分布式存儲系統。看到這里,如果您不明白Hbase是個啥東東,不要緊,我再總結一下下:x0dx0ax0dx0aHbase是一個面向列存儲的分布式存儲系統,它的優點在於可以實現高性能的並發讀寫操作,同時Hbase還會對數據進行透明的切分,這樣就使得存儲本身具有了水平伸縮性。x0dx0ax0dx0a二 Hbase數據模型 x0dx0aHBase,Cassandra的數據模型非常類似,他們的思想都是來源於Google的Bigtable,因此這三者的數據模型非常類似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我沒發現。好了,廢話少說,我們來看看Hbase的數據模型到底是個啥東東。x0dx0ax0dx0a在Hbase裡面有以下兩個主要的概念,Row key,Column Family,我們首先來看看Column family,Column family中文又名「列族」,Column family是在系統啟動之前預先定義好的,每一個Column Family都可以根據「限定符」有多個column.下面我們來舉個例子就會非常的清晰了。x0dx0ax0dx0a假如系統中有一個User表,如果按照傳統的RDBMS的話,User表中的列是固定的,比如schema 定義了name,age,sex等屬性,User的屬性是不能動態增加的。但是如果採用列存儲系統,比如Hbase,那麼我們可以定義User表,然後定義info 列族,User的數據可以分為:info:name = zhangsan,info:age=30,info:sex=male等,如果後來你又想增加另外的屬性,這樣很方便只需要info:newProperty就可以了。x0dx0ax0dx0a也許前面的這個例子還不夠清晰,我們再舉個例子來解釋一下,熟悉SNS的朋友,應該都知道有好友Feed,一般設計Feed,我們都是按照「某人在某時做了標題為某某的事情」,但是同時一般我們也會預留一下關鍵字,比如有時候feed也許需要url,feed需要image屬性等,這樣來說,feed本身的屬性是不確定的,因此如果採用傳統的關系資料庫將非常麻煩,況且關系資料庫會造成一些為null的單元浪費,而列存儲就不會出現這個問題,在Hbase里,如果每一個column 單元沒有值,那麼是佔用空間的。下面我們通過兩張圖來形象的表示這種關系:x0dx0ax0dx0a上圖是傳統的RDBMS設計的Feed表,我們可以看出feed有多少列是固定的,不能增加,並且為null的列浪費了空間。但是我們再看看下圖,下圖為Hbase,Cassandra,Bigtable的數據模型圖,從下圖可以看出,Feed表的列可以動態的增加,並且為空的列是不存儲的,這就大大節約了空間,關鍵是Feed這東西隨著系統的運行,各種各樣的Feed會出現,我們事先沒辦法預測有多少種Feed,那麼我們也就沒有辦法確定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基於列存儲的數據模型就非常適合此場景。說到這里,採用Hbase的這種方式,還有一個非常重要的好處就是Feed會自動切分,當Feed表中的數據超過某一個閥值以後,Hbase會自動為我們切分數據,這樣的話,查詢就具有了伸縮性,而再加上Hbase的弱事務性的特性,對Hbase的寫入操作也將變得非常快。x0dx0ax0dx0a上面說了Column family,那麼我之前說的Row key是啥東東,其實你可以理解row key為RDBMS中的某一個行的主鍵,但是因為Hbase不支持條件查詢以及Order by等查詢,因此Row key的設計就要根據你系統的查詢需求來設計了額。我還拿剛才那個Feed的列子來說,我們一般是查詢某個人最新的一些Feed,因此我們Feed的Row key可以有以下三個部分構成
E. HBase是什麼呢,都有哪些特點呢
Hbase是一種NoSQL資料庫,這意味著它不像傳統的RDBMS資料庫那樣支持SQL作為查詢語言。Hbase是一種分布式存儲的資料庫,技術上來講,它更像是分布式存儲而不是分布式資料庫,它缺少很多RDBMS系統的特性,比如列類型,輔助索引,觸發器,和高級查詢語言等待
那Hbase有什麼特性呢?如下:
強讀寫一致,但是不是「最終一致性」的數據存儲,這使得它非常適合高速的計算聚合
自動分片,通過Region分散在集群中,當行數增長的時候,Region也會自動的切分和再分配
自動的故障轉移
Hadoop/HDFS集成,和HDFS開箱即用,不用太麻煩的銜接
豐富的「簡潔,高效」API,Thrift/REST API,Java API
塊緩存,布隆過濾器,可以高效的列查詢優化
操作管理,Hbase提供了內置的web界面來操作,還可以監控JMX指標
首先資料庫量要足夠多,如果有十億及百億行數據,那麼Hbase是一個很好的選項,如果只有幾百萬行甚至不到的數據量,RDBMS是一個很好的選擇。因為數據量小的話,真正能工作的機器量少,剩餘的機器都處於空閑的狀態
其次,如果你不需要輔助索引,靜態類型的列,事務等特性,一個已經用RDBMS的系統想要切換到Hbase,則需要重新設計系統。
最後,保證硬體資源足夠,每個HDFS集群在少於5個節點的時候,都不能表現的很好。因為HDFS默認的復制數量是3,再加上一個NameNode。
存儲業務數據:車輛GPS信息,司機點位信息,用戶操作信息,設備訪問信息。。。
存儲日誌數據:架構監控數據(登錄日誌,中間件訪問日誌,推送日誌,簡訊郵件發送記錄。。。),業務操作日誌信息
存儲業務附件:UDFS系統存儲圖像,視頻,文檔等附件信息
什麼時候用Hbase?
Hbase不適合解決所有的問題:
Hbase在單機環境也能運行,但是請在開發環境的時候使用。
內部應用
不過在公司使用的時候,一般不使用原生的Hbase API,使用原生的API會導致訪問不可監控,影響系統穩定性,以致於版本升級的不可控。
HFile
HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的載入整個文件。索引的大小(keys的大小,數據量的大小)影響block的大小,在大數據集的情況下,block的大小設置為每個RegionServer 1GB也是常見的。
探討資料庫的數據存儲方式,其實就是探討數據如何在磁碟上進行有效的組織。因為我們通常以如何高效讀取和消費數據為目的,而不是數據存儲本身。
Hfile生成方式
起初,HFile中並沒有任何Block,數據還存在於MemStore中。
Flush發生時,創建HFile Writer,第一個空的Data Block出現,初始化後的Data Block中為Header部分預留了空間,Header部分用來存放一個Data Block的元數據信息。
而後,位於MemStore中的KeyValues被一個個append到位於內存中的第一個Data Block中:
註:如果配置了Data Block Encoding,則會在Append KeyValue的時候進行同步編碼,編碼後的數據不再是單純的KeyValue模式。Data Block Encoding是HBase為了降低KeyValue結構性膨脹而提供的內部編碼機制。
F. hbase和關系型資料庫的區別
Mongodb用於存儲非結構化數據,尤其擅長存儲json格式的數據。存儲的量大概在10億級別,再往上性能就下降了,除非另外分庫。
Hbase是架構在hdfs上的列式存儲,擅長rowkey的快速查詢,但模糊匹配查詢(其實是前模糊或全模糊)不擅長,但存儲的量可以達到百億甚至以上,比mongodb的存儲量大多了。