自 1970 年以來,關係數據庫用於數據存儲和維護有關問題的解決方案。大數據的出現後, 好多公司實現處理大數據並從中受益,並開始選擇像 Hadoop 的解決方案。Hadoop 使用分 布式文件系統,用於存儲大數據,並使用 MapReduce 來處理。Hadoop 擅長於存儲各類格式 的龐大的數據,任意的格式甚至非結構化的處理。mysql
Hadoop 的限制redis
Hadoop 只能執行批量處理,而且只以順序方式訪問數據。這意味着必須搜索整個數據集, 即便是最簡單的搜索工做。 當處理結果在另外一個龐大的數據集,也是按順序處理一個巨大的數據集。在這一點上,一個 新的解決方案,須要訪問數據中的任何點(隨機訪問)單元。sql
Hadoop 隨機存取數據庫mongodb
應用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存儲大量數據和 以隨機方式訪問數據的數據庫。數據庫
總結:數組
(1)海量數據量存儲成爲瓶頸,單臺機器沒法負載大量數據服務器
(2)單臺機器 IO 讀寫請求成爲海量數據存儲時候高併發大規模請求的瓶頸數據結構
(3)隨着數據規模愈來愈大,大量業務場景開始考慮數據存儲橫向水平擴展,使得存儲服 務能夠增長/刪除,而目前的關係型數據庫更專一於一臺機器併發
HBase 是 BigTable 的開源(源碼使用 Java 編寫)版本。是 Apache Hadoop 的數據庫,是建 立在 HDFS 之上,被設計用來提供高可靠性、高性能、列存儲、可伸縮、多版本的 NoSQL 的分佈式數據存儲系統,實現對大型數據的實時、隨機的讀寫訪問。 oracle
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
① 它介於 NoSQL 和 RDBMS 之間,僅能經過主鍵(rowkey)和主鍵的 range 來檢索數據
② HBase 查詢數據功能很簡單,不支持 join 等複雜操做
③ 不支持複雜的事務,只支持行級事務(可經過 hive 支持來實現多表 join 等複雜操做)。
④ HBase 中支持的數據類型:byte[](底層全部數據的存儲都是字節數組)
⑤ 主要用來存儲結構化和半結構化的鬆散數據。
結構化:數據結構字段含義肯定,清晰,典型的如數據庫中的表結構
半結構化:具備必定結構,但語義不夠肯定,典型的如 HTML 網頁,有些字段是肯定的(title), 有些不肯定(table)
非結構化:雜亂無章的數據,很難按照一個概念去進行抽取,無規律性
與 Hadoop 同樣,HBase 目標主要依靠橫向擴展,經過不斷增長廉價的商用服務器,來增長 計算和存儲能力。
一、大:一個表能夠有上十億行,上百萬列
二、面向列:面向列(族)的存儲和權限控制,列(簇)獨立檢索。
三、稀疏:對於爲空(null)的列,並不佔用存儲空間,所以,表能夠設計的很是稀疏。
四、無模式:每行都有一個可排序的主鍵和任意多的列,列能夠根據須要動態的增長,同一 張表中不一樣的行能夠有大相徑庭的列
初次接觸HBase,可能看到如下描述會懵:「基於列存儲」,「稀疏MAP」,「RowKey」,「ColumnFamily」。
其實沒那麼高深,咱們須要分兩步來理解HBase, 就可以理解爲何HBase可以「快速地」「分佈式地」處理「大量數據」了。
1.內存結構
2.文件存儲結構
加入咱們有以下一張表
Rowkey的概念和mysql中的主鍵是徹底同樣的,Hbase使用Rowkey來惟一的區分某一行的數據。
因爲Hbase只支持3中查詢方式:
一、基於Rowkey的單行查詢
二、基於Rowkey的範圍掃描
三、全表掃描
所以,Rowkey對Hbase的性能影響很是大,Rowkey的設計就顯得尤其的重要。設計的時候要兼顧基於Rowkey的單行查詢也要鍵入Rowkey的範圍掃描。具體Rowkey要如何設計後續會整理相關的文章作進一步的描述。這裏你們只要有一個概念就是Rowkey的設計極爲重要。
rowkey 行鍵能夠是任意字符串(最大長度是 64KB,實際應用中長度通常爲 10-100bytes),最好是 16。在 HBase 內部,rowkey 保存爲字節數組。HBase 會對錶中的數據按照 rowkey 排序 (字典順序)
列,可理解成MySQL列。
列族, HBase引入的概念。
Hbase經過列族劃分數據的存儲,列族下面能夠包含任意多的列,實現靈活的數據存取。就像是家族的概念,咱們知道一個家族是因爲不少個的家庭組成的。列族也相似,列族是由一個一個的列組成(任意多)。
Hbase表的建立的時候就必須指定列族。就像關係型數據庫建立的時候必須指定具體的列是同樣的。
Hbase的列族不是越多越好,官方推薦的是列族最好小於或者等於3。咱們使用的場景通常是1個列族。
TimeStamp對Hbase來講相當重要,由於它是實現Hbase多版本的關鍵。在Hbase中使用不一樣的timestame來標識相同rowkey行對應的不通版本的數據。
HBase 中經過 rowkey 和 columns 肯定的爲一個存儲單元稱爲 cell。每一個 cell 都保存着同一份 數據的多個版本。版本經過時間戳來索引。時間戳的類型是 64 位整型。時間戳能夠由 hbase(在數據寫入時
自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也能夠由 客戶顯式賦值。若是應用程序要避免數據版本衝突,就必須本身生成具備惟一性的時間戳。 每一個 cell 中,不一樣版本的數據按照時間
倒序排序,即最新的數據排在最前面。