目錄 正文 產(chǎn)生背景
自 1970 年以來,關(guān)系數(shù)據(jù)庫用于數(shù)據(jù)存儲和維護有關(guān)問題的解決方案。大數(shù)據(jù)的出現(xiàn)后, 好多公司實現(xiàn)處理大數(shù)據(jù)并從中受益,并開始選擇像 Hadoop 的解決方案。Hadoop 使用分 布式文件系統(tǒng),用于存儲大數(shù)據(jù),并使用 MapReduce 來處理。Hadoop 擅長于存儲各種格式 的龐大的數(shù)據(jù),任意的格式甚至非結(jié)構(gòu)化的處理。
Hadoop 的限制
Hadoop 只能執(zhí)行批量處理,并且只以順序方式訪問數(shù)據(jù)。這意味著必須搜索整個數(shù)據(jù)集, 即使是最簡單的搜索工作。 當處理結(jié)果在另一個龐大的數(shù)據(jù)集,也是按順序處理一個巨大的數(shù)據(jù)集。在這一點上,一個 新的解決方案,需要訪問數(shù)據(jù)中的任何點(隨機訪問)單元。
Hadoop 隨機存取數(shù)據(jù)庫
應(yīng)用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存儲大量數(shù)據(jù)和 以隨機方式訪問數(shù)據(jù)的數(shù)據(jù)庫。
總結(jié):
(1)海量數(shù)據(jù)量存儲成為瓶頸,單臺機器無法負載大量數(shù)據(jù)
(2)單臺機器 IO 讀寫請求成為海量數(shù)據(jù)存儲時候高并發(fā)大規(guī)模請求的瓶頸
(3)隨著數(shù)據(jù)規(guī)模越來越大,大量業(yè)務(wù)場景開始考慮數(shù)據(jù)存儲橫向水平擴展,使得存儲服 務(wù)可以增加/刪除,而目前的關(guān)系型數(shù)據(jù)庫更專注于一臺機器
HBase簡介
HBase 是 BigTable 的開源(源碼使用 Java 編寫)版本。是 Apache Hadoop 的數(shù)據(jù)庫,是建 立在 HDFS 之上,被設(shè)計用來提供高可靠性、高性能、列存儲、可伸縮、多版本的 NoSQL 的分布式數(shù)據(jù)存儲系統(tǒng),實現(xiàn)對大型數(shù)據(jù)的實時、隨機的讀寫訪問。
HBase 依賴于 HDFS 做底層的數(shù)據(jù)存儲,BigTable 依賴 Google GFS 做數(shù)據(jù)存儲
HBase 依賴于 MapReduce 做數(shù)據(jù)計算,BigTable 依賴 Google MapReduce 做數(shù)據(jù)計算
HBase 依賴于 ZooKeeper 做服務(wù)協(xié)調(diào),BigTable 依賴 Google Chubby 做服務(wù)協(xié)調(diào)
NoSQL = NO SQL
NoSQL = Not Only SQL:會有一些把 NoSQL 數(shù)據(jù)的原生查詢語句封裝成 SQL,比如 HBase 就有 Phoenix 工具
關(guān)系型數(shù)據(jù)庫 和 非關(guān)系型數(shù)據(jù)庫的典型代表
NoSQL:hbase, redis, mongodb
RDBMS:mysql,oracle,sql server,db2
HBase 這個 NoSQL 數(shù)據(jù)庫的要點
① 它介于 NoSQL 和 RDBMS 之間,僅能通過主鍵(rowkey)和主鍵的 range 來檢索數(shù)據(jù)
② HBase 查詢數(shù)據(jù)功能很簡單,不支持 join 等復(fù)雜操作
③ 不支持復(fù)雜的事務(wù),只支持行級事務(wù)(可通過 hive 支持來實現(xiàn)多表 join 等復(fù)雜操作)。
④ HBase 中支持的數(shù)據(jù)類型:byte[](底層所有數(shù)據(jù)的存儲都是字節(jié)數(shù)組)
⑤ 主要用來存儲結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。
結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化
結(jié)構(gòu)化:數(shù)據(jù)結(jié)構(gòu)字段含義確定,清晰,典型的如數(shù)據(jù)庫中的表結(jié)構(gòu)
半結(jié)構(gòu)化:具有一定結(jié)構(gòu),但語義不夠確定,典型的如 HTML 網(wǎng)頁,有些字段是確定的(title), 有些不確定(table)
非結(jié)構(gòu)化:雜亂無章的數(shù)據(jù),很難按照一個概念去進行抽取,無規(guī)律性
與 Hadoop 一樣,HBase 目標主要依靠橫向擴展,通過不斷增加廉價的商用服務(wù)器,來增加 計算和存儲能力。
HBase 中的表特點
1、大:一個表可以有上十億行,上百萬列
2、面向列:面向列(族)的存儲和權(quán)限控制,列(簇)獨立檢索。
3、稀疏:對于為空(null)的列,并不占用存儲空間,因此,表可以設(shè)計的非常稀疏。
4、無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據(jù)需要動態(tài)的增加,同一 張表中不同的行可以有截然不同的列

HBase表結(jié)構(gòu)邏輯視圖
初次接觸HBase,可能看到以下描述會懵:“基于列存儲”,“稀疏MAP”,“RowKey”,“ColumnFamily”。
其實沒那么高深,我們需要分兩步來理解HBase, 就能夠理解為什么HBase能夠“快速地”“分布式地”處理“大量數(shù)據(jù)”了。
1.內(nèi)存結(jié)構(gòu)
2.文件存儲結(jié)構(gòu)
名詞概念
加入我們有如下一張表

Rowkey的概念
Rowkey的概念和mysql中的主鍵是完全一樣的,Hbase使用Rowkey來唯一的區(qū)分某一行的數(shù)據(jù)。
由于Hbase只支持3中查詢方式:
1、基于Rowkey的單行查詢
2、基于Rowkey的范圍掃描
3、全表掃描
因此,Rowkey對Hbase的性能影響非常大,Rowkey的設(shè)計就顯得尤為的重要。設(shè)計的時候要兼顧基于Rowkey的單行查詢也要鍵入Rowkey的范圍掃描。具體Rowkey要如何設(shè)計后續(xù)會整理相關(guān)的文章做進一步的描述。這里大家只要有一個概念就是Rowkey的設(shè)計極為重要。
rowkey 行鍵可以是任意字符串(最大長度是 64KB,實際應(yīng)用中長度一般為 10-100bytes),最好是 16。在 HBase 內(nèi)部,rowkey 保存為字節(jié)數(shù)組。HBase 會對表中的數(shù)據(jù)按照 rowkey 排序 (字典順序)
Column的概念
列,可理解成MySQL列。
ColumnFamily的概念
列族, HBase引入的概念。
Hbase通過列族劃分數(shù)據(jù)的存儲,列族下面可以包含任意多的列,實現(xiàn)靈活的數(shù)據(jù)存取。就像是家族的概念,我們知道一個家族是由于很多個的家庭組成的。列族也類似,列族是由一個一個的列組成(任意多)。
Hbase表的創(chuàng)建的時候就必須指定列族。就像關(guān)系型數(shù)據(jù)庫創(chuàng)建的時候必須指定具體的列是一樣的。
Hbase的列族不是越多越好,官方推薦的是列族最好小于或者等于3。我們使用的場景一般是1個列族。
TimeStamp的概念
TimeStamp對Hbase來說至關(guān)重要,因為它是實現(xiàn)Hbase多版本的關(guān)鍵。在Hbase中使用不同的timestame來標識相同rowkey行對應(yīng)的不通版本的數(shù)據(jù)。
HBase 中通過 rowkey 和 columns 確定的為一個存儲單元稱為 cell。每個 cell 都保存著同一份 數(shù)據(jù)的多個版本。版本通過時間戳來索引。時間戳的類型是 64 位整型。時間戳可以由 hbase(在數(shù)據(jù)寫入時
自動)賦值,此時時間戳是精確到毫秒的當前系統(tǒng)時間。時間戳也可以由 客戶顯式賦值。如果應(yīng)用程序要避免數(shù)據(jù)版本沖突,就必須自己生成具有唯一性的時間戳。 每個 cell 中,不同版本的數(shù)據(jù)按照時間
倒序排序,即最新的數(shù)據(jù)排在最前面。
為了避免數(shù)據(jù)存在過多版本造成的的管理 (包括存貯和索引)負擔(dān),hbase 提供了兩種數(shù)據(jù)版 本回收方式:
保存數(shù)據(jù)的最后 n 個版本
保存最近一段時間內(nèi)的版本(設(shè)置數(shù)據(jù)的生命周期 TTL)。
用戶可以針對每個列簇進行設(shè)置。
單元格(Cell)
由{rowkey, column( = + ), version} 唯一確定的單元。 Cell 中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存貯。
|