HBase 是一個構建在 Hadoop 文件系統之上的面向列的數據庫管理系統。html
要想明白爲何產生 HBase,就須要先了解一下 Hadoop 存在的限制?Hadoop 能夠經過 HDFS 來存儲結構化、半結構甚至非結構化的數據,它是傳統數據庫的補充,是海量數據存儲的最佳方法,它針對大文件的存儲,批量訪問和流式訪問都作了優化,同時也經過多副本解決了容災問題。git
可是 Hadoop 的缺陷在於它只能執行批處理,而且只能以順序方式訪問數據,這意味着即便是最簡單的工做,也必須搜索整個數據集,沒法實現對數據的隨機訪問。實現數據的隨機訪問是傳統的關係型數據庫所擅長的,但它們卻不能用於海量數據的存儲。在這種狀況下,必須有一種新的方案來解決海量數據存儲和隨機訪問的問題,HBase 就是其中之一 (HBase,Cassandra,couchDB,Dynamo 和 MongoDB 都能存儲海量數據並支持隨機訪問)。github
注:數據結構分類:sql
- 結構化數據:即以關係型數據庫表形式管理的數據;
- 半結構化數據:非關係模型的,有基本固定結構模式的數據,例如日誌文件、XML 文檔、JSON 文檔、Email 等;
- 非結構化數據:沒有固定模式的數據,如 WORD、PDF、PPT、EXL,各類格式的圖片、視頻等。
HBase 是一個構建在 Hadoop 文件系統之上的面向列的數據庫管理系統。數據庫
HBase 是一種相似於 Google’s Big Table
的數據模型,它是 Hadoop 生態系統的一部分,它將數據存儲在 HDFS 上,客戶端能夠經過 HBase 實現對 HDFS 上數據的隨機訪問。它具備如下特性:數組
HBase 是一個面向 列
的數據庫管理系統,這裏更爲確切的而說,HBase 是一個面向 列族
的數據庫管理系統。表 schema 僅定義列族,表具備多個列族,每一個列族能夠包含任意數量的列,列由多個單元格(cell )組成,單元格能夠存儲多個版本的數據,多個版本數據以時間戳進行區分。數據結構
下圖爲 HBase 中一張表的:框架
圖片引用自 : HBase 是列式存儲數據庫嗎 https://www.iteblog.com/archives/2498.htmloop
Hbase 的表具備如下特色:性能
容量大:一個表能夠有數十億行,上百萬列;
面向列:數據是按照列存儲,每一列都單獨存放,數據即索引,在查詢時能夠只訪問指定列的數據,有效地下降了系統的 I/O 負擔;
稀疏性:空 (null) 列並不佔用存儲空間,表能夠設計的很是稀疏 ;
數據多版本:每一個單元中的數據能夠有多個版本,按照時間戳排序,新的數據在最上面;
存儲類型:全部數據的底層存儲格式都是字節數組 (byte[])。
Phoenix
是 HBase 的開源 SQL 中間層,它容許你使用標準 JDBC 的方式來操做 HBase 上的數據。在 Phoenix
以前,若是你要訪問 HBase,只能調用它的 Java API,但相比於使用一行 SQL 就能實現數據查詢,HBase 的 API 仍是過於複雜。Phoenix
的理念是 we put sql SQL back in NOSQL
,即你可使用標準的 SQL 就能完成對 HBase 上數據的操做。同時這也意味着你能夠經過集成 Spring Data JPA
或 Mybatis
等經常使用的持久層框架來操做 HBase。
其次 Phoenix
的性能表現也很是優異,Phoenix
查詢引擎會將 SQL 查詢轉換爲一個或多個 HBase Scan,經過並行執行來生成標準的 JDBC 結果集。它經過直接使用 HBase API 以及協處理器和自定義過濾器,能夠爲小型數據查詢提供毫秒級的性能,爲千萬行數據的查詢提供秒級的性能。同時 Phoenix 還擁有二級索引等 HBase 不具有的特性,由於以上的優勢,因此 Phoenix
成爲了 HBase 最優秀的 SQL 中間層。
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南