這篇文章主要介紹了Apache HBase是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Apache HBase(Hadoop Database) 是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用 HBase 技術可在廉價 PC 上搭建起大規模結構化存儲集群。
HBase 是 Google Bigtable 的開源實現,類似 Google Bigtable 利用 GFS 作為其文件存儲系統,HBase 利用 Hadoop HDFS 作為其文件存儲系統;Google 運行 MapReduce 來處理 Bigtable 中的海量數據,HBase 同樣利用 Hadoop MapReduce 來處理 HBase 中的海量數據;Google Bigtable 利用 Chubby 作為協同服務,HBase 利用 Zookeeper 作為對應。
HBase 是一種“NoSQL”數據庫?!癗oSQL”是一個通用詞表示數據庫不是RDBMS ,后者支持 SQL 作為主要訪問手段。有許多種 NoSQL 數據庫,比如,BerkeleyDB 是本地 NoSQL 數據庫例子,而 HBase 是大型分布式數據庫。從技術上來說, HBase 更像是“Data Store(數據存儲)”多于“Data Base(數據庫)”,因為 HBase 缺少很多 RDBMS 的特性,如列類型、第二索引、觸發器、高級查詢語言等。
然而,HBase 有許多特征同時支持線性化和模塊化擴充。HBase 集群通過增加 RegionServer 進行擴展,而且只需要將它可以放到普通的服務器中即可。例如,如果集群從10個擴充到20個 RegionServer,存儲空間和處理容量都同時翻倍。RDBMS 也能進行擴充,但僅針對某個點——特別是對一個單獨數據庫服務器的大小——同時,為了更好的性能,需要依賴特殊的硬件和存儲設備,而 HBase 并不需要這些。
HBase 具有如下特性:
強一致性讀寫:HBase 不是“eventually consistent(最終一致性)”數據存儲。這讓它很適合高速計數聚合類任務;
自動分片(Automatic sharding): HBase 表通過 region 分布在集群中。數據增長時,region 會自動分割并重新分布;
RegionServer 自動故障轉移;
Hadoop/HDFS 集成:HBase 支持開箱即用地支持 HDFS 作為它的分布式文件系統;
MapReduce: HBase 通過 MapReduce 支持大并發處理;
Java 客戶端 API:HBase 支持易于使用的 Java API 進行編程訪問;
Thrift/REST API:HBase 也支持 Thrift 和 REST 作為非 Java 前端的訪問;
Block Cache 和 Bloom Filter:對于大容量查詢優化, HBase 支持 Block Cache 和 Bloom Filter;
運維管理:HBase 支持 JMX 提供內置網頁用于運維。
HBase 不適合所有場景。
首先,確信有足夠多數據,如果有上億或上千億行數據,HBase 是很好的備選。如果只有上千或上百萬行,則用傳統的R DBMS 可能是更好的選擇。因為所有數據可以在一兩個節點保存,集群其他節點可能閑置。
其次,確信可以不依賴所有 RDBMS 的額外特性(例如,列數據類型、 第二索引、事務、高級查詢語言等)。
第三,確信你有足夠的硬件。因為 HDFS 在小于5個數據節點時,基本上體現不出它的優勢。
雖然,HBase 能在單獨的筆記本上運行良好,但這應僅當成是開發階段的配置。
Hbase 的優點:
列的可以動態增加,并且列為空就不存儲數據,節省存儲空間
Hbase 自動切分數據,使得數據存儲自動具有水平擴展
Hbase 可以提供高并發讀寫操作的支持
與 Hadoop MapReduce 相結合有利于數據分析
容錯性
版權免費
非常靈活的模式設計(或者說沒有固定模式的限制)
可以跟 Hive 集成,使用類 SQL 查詢
自動故障轉移
客戶端接口易于使用
行級別原子性,即,PUT 操作一定是完全成功或者完全失敗
Hbase 的缺點:
不能支持條件查詢,只支持按照 row key 來查詢
容易產生單點故障(在只使用一個 HMaster 的時候)
不支持事務
JOIN 不是數據庫層支持的,而需要用 MapReduce
只能在逐漸上索引和排序
沒有內置的身份和權限認證
HDFS 是分布式文件系統,適合保存大文件。官方宣稱它并非普通用途文件系統,不提供文件的個別記錄的快速查詢。另一方面,HBase 基于 HDFS,并能夠提供大表的記錄快速查找和更新。這有時會可能引起概念混亂。HBase 內部將數據放到索引好的“StoreFiles”存儲文件中,以便提供高速查詢,而存儲文件位于 HDFS中。
如果想了解 HBase 更深層次的內容,推薦閱讀 Lars George 的《HBase: The Definitive Guide》。
在 HBase 的數據被存儲在表中,具有行和列。這和關系數據庫(RDBMS中)的術語是重疊,但在概念上它們不是一類。相反,應該將 HBase 的表當作是一個多維的 map 結構而更容易讓人理解。
Table(表):HBase table 由多個 row 組成。
Row(行):每一 row 代表著一個數據對象,每一 row 都是以一個 row key(行鍵)和一個或者多個 column 組成。row key 是每個數據對象的唯一標識的,按字母順序排序,即 row 也是按照這個順序來進行存儲的。所以,row key 的設計相當重要,一個重要的原則是,相關的 row 要存儲在接近的位置。比如網站的域名,row key 就是域名,在設計時要將域名反轉(例如,org.apache.www、org.apache.mail、org.apache.jira),這樣的話, Apache 相關的域名在 table 中存儲的位置就會非常接近的。
Column(列):column 由 column family 和 column qualifier 組成,由冒號(:
)進行進行間隔。比如family:qualifier
。
Column Family(列族):在 HBase,column family 是 一些 column 的集合。一個 column family 所有 column 成員是有著相同的前綴。比如, courses:history 和 courses:math 都是 courses 的成員。冒號(:
)是 column family 的分隔符,用來區分前綴和列名。column 前綴必須是可打印的字符,剩下的部分列名可以是任意字節數組。column family 必須在 table 建立的時候聲明。column 隨時可以新建。在物理上,一個的 column family 成員在文件系統上都是存儲在一起。因為存儲優化都是針對 column family 級別的,這就意味著,一個 column family 的所有成員的是用相同的方式訪問的。
Column Qualifier(列限定符):column family 中的數據通過 column qualifier 來進行映射。column qualifier 也沒有特定的數據類型,以二進制字節來存儲。比如某個 column family “content”,其 column qualifier 可以設置為 “content:html” 和 “content:pdf”。雖然 column family 是在 table 創建時就固定了,但 column qualifier 是可變的,可能在不同的 row 之間有很大不同。
Cell(單元格):cell 是 row、column family 和 column qualifier 的組合,包含了一個值和一個 timestamp,用于標識值的版本。
Timestamp(時間戳):每個值都會有一個 timestamp,作為該值特定版本的標識符。默認情況下,timestamp 代表了當數據被寫入 RegionServer 的時間,但你也可以在把數據放到 cell 時指定不同的 timestamp。
HBase/Bigtable 的核心數據結構就是 map。不同的編程語言針對 map 有不同的術語,比如 associative array(PHP)、associative array(Python),Hash(Ruby)或 Object (JavaScript)。
簡單來說,map 就是 key-value 對集合。下面是一個用 JSON 格式來表達 map 的例子:
{ "zzzzz" : "woot", "xyz" : "hello", "aaaab" : "world", "1" : "x", "aaaaa" : "y" }
毫無疑問,HBase/Bigtable 都是建立在分布式系統上的,HBase 基于 Hadoop Distributed File System (HDFS) 或者 Amazon's Simple Storage Service(S3),而 Bigtable 使用 Google File System(GFS)。它們要解決的一個問題就是數據的同步。這里不討論如何做到數據同步。 HBase/Bigtable 可以部署在成千上萬的機器上來分散訪問壓力。
和一般的 map 實現有所區別,HBase/Bigtable 中的 map 是按字母順序嚴格排序的。這就是說,對于 row key 是“aaaaa”的旁邊 row key 應該是 “aaaab”,而與 row key 是“zzzzz”離得較遠。
還是以上面的 JSON 為例,一個排好序的例子如下:
{ "1" : "x", "aaaaa" : "y", "aaaab" : "world", "xyz" : "hello", "zzzzz" : "woot" }
在一個大數據量的系統里面,排序很重要,特別是 row key 的設置策略決定了查詢的性能。比如網站的域名,row key 就是域名,在設計時要將域名反轉(例如,org.apache.www、org.apache.mail、org.apache.jira)。
多維 map,即 map 里面嵌套 map。例如:
{ "1" : { "A" : "x", "B" : "z" }, "aaaaa" : { "A" : "y", "B" : "w" }, "aaaab" : { "A" : "world", "B" : "ocean" }, "xyz" : { "A" : "hello", "B" : "there" }, "zzzzz" : { "A" : "woot", "B" : "1337" } }
在查詢中不指定時間,返回的將是最近的一個時間的版本。如果給出 timestamp,返回的將是早于這個時間的數值。例如: 查詢 row/column 是“aaaaa”/“A:foo”的,將返回 y;查詢 row/column/timestamp 是“aaaaa”/“A:foo”/10的,將返回 m;查詢 row/column/timestamp 是“aaaaa”/“A:foo”/2的,將返回 null。
{ // ... "aaaaa" : { "A" : { "foo" : { 15 : "y", 4 : "m" }, "bar" : { 15 : "d", } }, "B" : { "" : { 6 : "w" 3 : "o" 1 : "w" } } }, // ... }
下面表格是一個名為 webtable 的 table ,包含了兩個 row(com.cnn.www
和 com.example.www
)和三個 column family(contents
、 anchor
和people
)。第一個 row(com.cnn.www
)中,anchor
包含了兩個 column(anchor:cssnsi.com
和 anchor:my.look.ca
),contents
包含了一個 column(contents:html
)。在這個例子里面,row key 是com.cnn.www
的 row 包含了5個版本,而 row key 是com.example.www
的 row 包含了1個版本。column qualifier 為 contents:html
包含了給定網站的完整的 HTML。column family 是anchor
的每個 qualifier 包含了網站的鏈接。人們列族代表與網站相關的人。column family 是people
關聯的是網站的人物資料。
Row Key | Timestamp | ColumnFamily contents | ColumnFamily anchor | ColumnFamily people |
---|---|---|---|---|
"com.cnn.www" | t9 | anchor:cnnsi.com = "CNN" | ||
"com.cnn.www" | t8 | anchor:my.look.ca = "CNN.com" | ||
"com.cnn.www" | t6 | contents:html = "<html>..." | ||
"com.cnn.www" | t5 | contents:html = "<html>..." | ||
"com.cnn.www" | t3 | contents:html = "<html>..." |
在這個表中顯示為空的 cell 不占用空間,這使得 HBase 變得“稀疏”。除了表格方式來展現數據試圖,也使用使用多維 map,如下:
{ "com.cnn.www": { contents: { t6: contents:html: "<html>..." t5: contents:html: "<html>..." t3: contents:html: "<html>..." } anchor: { t9: anchor:cnnsi.com = "CNN" t8: anchor:my.look.ca = "CNN.com" } people: {} } "com.example.www": { contents: { t5: contents:html: "<html>..." } anchor: {} people: { t5: people:author: "John Doe" } } }
盡管在概念視圖里,table 可以被看成是一個稀疏的 row 的集合。但在物理上,它的是按照 column family 存儲的。新的 column qualifier (column_family:column_qualifier)可以隨時添加進已有的 column family 。
下表是一個 ColumnFamily anchor
:
Row Key | Timestamp | Column Family anchor |
---|---|---|
"com.cnn.www" | t9 | anchor:cnnsi.com = "CNN" |
"com.cnn.www" | t8 | anchor:my.look.ca = "CNN.com" |
下表是一個 ColumnFamily contents
:
Row Key | Timestamp | ColumnFamily contents: |
---|---|---|
"com.cnn.www" | t6 | contents:html = "<html>..." |
"com.cnn.www" | t5 | contents:html = "<html>..." |
"com.cnn.www" | t3 | contents:html = "<html>..." |
值得注意的是在上面的概念視圖中空白 cell 在物理上是不存儲的,因為根本沒有必要存儲。因此若一個請求為要獲取 t8 時間的contents:html
,他的結果就是空。相似的,若請求為獲取 t9 時間的anchor:my.look.ca
,結果也是空。但是,如果不指明 timestamp,將會返回最新時間的 column。例如,如果請求為獲取行鍵為“com.cnn.www”,沒有指明 timestamp 的話,返回的結果是 t6 下的contents:html
,t9下的anchor:cnnsi.com
和 t8 下anchor:my.look.ca
。
四個主要的數據模型操作是 Get、Put、Scan 和 Delete。通過 Table 實例進行操作。有關 Table 的 API 可以參見 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html。
Get 返回特定 row 的屬性。 Get 通過 Table.get 執行。有關 Get 的 API 可以參見 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Get.html。
Put 要么向 table 增加新 row(如果 key 是新的)或更新 row(如果 key 已經存在)。 Put 通過 Table.put(writeBuffer)或 Table.batch(非 writeBuffer)執行。有關 Put 的 API 可以參見 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Put.html。
Scan 允許多個 row 特定屬性迭代。
下面是一個在 Table 表實例上的 Scan 示例。假設 table 有幾行 row key 為“row1”、“row2”、“row3”,還有一些 row key 值為“abc1”、 “abc2” 和“abc3”。下面的示例展示 Scan 實例如何返回“row”打頭的 row。
public static final byte[] CF = "cf".getBytes(); public static final byte[] ATTR = "attr".getBytes(); ... Table table = ... // instantiate a Table instance Scan scan = new Scan(); scan.addColumn(CF, ATTR); scan.setRowPrefixFilter(Bytes.toBytes("row")); ResultScanner rs = table.getScanner(scan); try { for (Result r = rs.next(); r != null; r = rs.next()) { // process result... } } finally { rs.close(); // always close the ResultScanner! }
注意,通常最簡單的方法來指定用于 scan 停止點是采用 InclusiveStopFilter 類,其 API 可以參見 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/InclusiveStopFilter.html。
Delete 用于從 table 中刪除 row。Delete 通過 Table.delete 執行。有關 Delete 的 API 可以參見 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Delete.html。
HBase 沒有修改數據的合適方法。所以 delete 通過創建名為 tombstones 的新標志進行處理。這些 tombstones 和死去的值,會在 major compaction 時清除掉。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Apache HBase是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。