產生背景
自 1970 年以來,關系數據庫用於數據存儲和維護有關問題的解決方案。大數據的出現后, 好多公司實現處理大數據並從中受益,並開始選擇像 Hadoop 的解決方案。Hadoop 使用分 布式文件系統,用於存儲大數據,並使用 MapReduce 來處理。Hadoop 擅長於存儲各種格式 的龐大的數據,任意的格式甚至非結構化的處理。
Hadoop 的限制
Hadoop 只能執行批量處理,並且只以順序方式訪問數據。這意味着必須搜索整個數據集, 即使是最簡單的搜索工作。 當處理結果在另一個龐大的數據集,也是按順序處理一個巨大的數據集。在這一點上,一個 新的解決方案,需要訪問數據中的任何點(隨機訪問)單元。
Hadoop 隨機存取數據庫
應用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存儲大量數據和 以隨機方式訪問數據的數據庫。
總結:
(1)海量數據量存儲成為瓶頸,單台機器無法負載大量數據
(2)單台機器 IO 讀寫請求成為海量數據存儲時候高並發大規模請求的瓶頸
(3)隨着數據規模越來越大,大量業務場景開始考慮數據存儲橫向水平擴展,使得存儲服 務可以增加/刪除,而目前的關系型數據庫更專注於一台機器
HBase簡介
HBase 是 BigTable 的開源(源碼使用 Java 編寫)版本。是 Apache Hadoop 的數據庫,是建 立在 HDFS 之上,被設計用來提供高可靠性、高性能、列存儲、可伸縮、多版本的 NoSQL 的分布式數據存儲系統,實現對大型數據的實時、隨機的讀寫訪問。
HBase 依賴於 HDFS 做底層的數據存儲,BigTable 依賴 Google GFS 做數據存儲
HBase 依賴於 MapReduce 做數據計算,BigTable 依賴 Google MapReduce 做數據計算
HBase 依賴於 ZooKeeper 做服務協調,BigTable 依賴 Google Chubby 做服務協調
NoSQL = NO SQL
NoSQL = Not Only SQL:會有一些把 NoSQL 數據的原生查詢語句封裝成 SQL,比如 HBase 就有 Phoenix 工具
關系型數據庫 和 非關系型數據庫的典型代表
NoSQL:hbase, redis, mongodb
RDBMS:mysql,oracle,sql server,db2
HBase 這個 NoSQL 數據庫的要點
① 它介於 NoSQL 和 RDBMS 之間,僅能通過主鍵(rowkey)和主鍵的 range 來檢索數據
② HBase 查詢數據功能很簡單,不支持 join 等復雜操作
③ 不支持復雜的事務,只支持行級事務(可通過 hive 支持來實現多表 join 等復雜操作)。
④ HBase 中支持的數據類型:byte[](底層所有數據的存儲都是字節數組)
⑤ 主要用來存儲結構化和半結構化的松散數據。
結構化、半結構化和非結構化
結構化:數據結構字段含義確定,清晰,典型的如數據庫中的表結構
半結構化:具有一定結構,但語義不夠確定,典型的如 HTML 網頁,有些字段是確定的(title), 有些不確定(table)
非結構化:雜亂無章的數據,很難按照一個概念去進行抽取,無規律性
與 Hadoop 一樣,HBase 目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加 計算和存儲能力。
HBase 中的表特點
1、大:一個表可以有上十億行,上百萬列
2、面向列:面向列(族)的存儲和權限控制,列(簇)獨立檢索。
3、稀疏:對於為空(null)的列,並不占用存儲空間,因此,表可以設計的非常稀疏。
4、無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一 張表中不同的行可以有截然不同的列
HBase表結構邏輯視圖
初次接觸HBase,可能看到以下描述會懵:“基於列存儲”,“稀疏MAP”,“RowKey”,“ColumnFamily”。
其實沒那么高深,我們需要分兩步來理解HBase, 就能夠理解為什么HBase能夠“快速地”“分布式地”處理“大量數據”了。
1.內存結構
2.文件存儲結構
名詞概念
加入我們有如下一張表
Rowkey的概念
Rowkey的概念和mysql中的主鍵是完全一樣的,Hbase使用Rowkey來唯一的區分某一行的數據。
由於Hbase只支持3中查詢方式:
1、基於Rowkey的單行查詢
2、基於Rowkey的范圍掃描
3、全表掃描
因此,Rowkey對Hbase的性能影響非常大,Rowkey的設計就顯得尤為的重要。設計的時候要兼顧基於Rowkey的單行查詢也要鍵入Rowkey的范圍掃描。具體Rowkey要如何設計后續會整理相關的文章做進一步的描述。這里大家只要有一個概念就是Rowkey的設計極為重要。
rowkey 行鍵可以是任意字符串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),最好是 16。在 HBase 內部,rowkey 保存為字節數組。HBase 會對表中的數據按照 rowkey 排序 (字典順序)
Column的概念
列,可理解成MySQL列。
ColumnFamily的概念
列族, HBase引入的概念。
Hbase通過列族划分數據的存儲,列族下面可以包含任意多的列,實現靈活的數據存取。就像是家族的概念,我們知道一個家族是由於很多個的家庭組成的。列族也類似,列族是由一個一個的列組成(任意多)。
Hbase表的創建的時候就必須指定列族。就像關系型數據庫創建的時候必須指定具體的列是一樣的。
Hbase的列族不是越多越好,官方推薦的是列族最好小於或者等於3。我們使用的場景一般是1個列族。
TimeStamp的概念
TimeStamp對Hbase來說至關重要,因為它是實現Hbase多版本的關鍵。在Hbase中使用不同的timestame來標識相同rowkey行對應的不通版本的數據。
HBase 中通過 rowkey 和 columns 確定的為一個存儲單元稱為 cell。每個 cell 都保存着同一份 數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64 位整型。時間戳可以由 hbase(在數據寫入時
自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由 客戶顯式賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。 每個 cell 中,不同版本的數據按照時間
倒序排序,即最新的數據排在最前面。
單元格(Cell)
由{rowkey, column( = + ), version} 唯一確定的單元。 Cell 中的數據是沒有類型的,全部是字節碼形式存貯。