初識HBase

HBase是一個開源的,分佈式的,多版本的,面向列的存儲模型。

面向列:簡單來說,就是指在存儲數據庫中的數據時,以列爲單位來存儲,把一列的數據串在一起存儲起來,而非把一行的數據作爲一個單元存儲起來。
HBase的特點:

  • HBase是構建在HDFS上的列式存儲系統
  • 基於Google的BigTable模型開發,典型的key/value系統
  • 邏輯上,HBase將數據按照表,行和列進行存儲
  • HBase主要靠橫向的擴展,通過不斷地增加廉價的商用服務器來增加計算和存儲能力。

HBase表的特點

  • 大:一個表可以有十幾億行,上百萬列
  • 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,而同一張表中不同的行可以有截然不同的列
  • 面向列:面向列的存儲和權限控制,列獨立的檢索
  • 稀疏:空(null)列不佔用存儲空間,可以設計的非常稀疏
  • 數據多版本:每個單元的數據有多個版本,自動的分配版本號
  • 類型單一:一切都是字符串,無其他類型

HBase的體系結構

這裏寫圖片描述
HBase服務器體系結構遵從簡單的主從服務器架構,由HRegion服務器集羣和HMaster服務器構成。

HRegion

當表大小超過設置值,會自動分配不同的域,稱爲HRegion

HRegion服務器

一般一臺機器上面只運行一個HRegion服務器,每一個區段的HRegion只會被一個HRegion服務器維護
HRegion服務器主要由兩大部分:HLOG部分和HRegion部分。HLOG用來存儲數據日誌,採用的是先寫日誌的方式,即數據來的時候,先會記錄進日誌裏面,後才存入HRegion中。HRegion服務器由多個HRegion組成,而HRegion則是由多個store組成,一個store存儲的是同一列族下的數據。每個HRegion都有一個Memstore,作爲數據緩衝,當數據發送來的時候,會先寫入 Memstore中,等到緩衝區滿了之後,再更新到對應的storefile中,store中包含多個storefile,storefile負責實際數據的存儲,爲HBase的最小單元。

HBase Master服務器

每臺HRegion服務器都會與HMaster服務器進行通訊,而HMaster的主要任務就是告訴每個HRegion服務器它需要維護的HRegion。
HMaster主要負責Table和HRegion的管理工作,具體包括:

  1. 管理用戶對Table的增刪改查
  2. HRegion服務器的負載均衡,調整HRegion的分佈
  3. HRegion分裂後,負責新的HRegion的分配
  4. HRegion服務器停機後,負責實效的HRegion服務器上HRegion的遷移

ROOT表和META表

保存元數據的表,我們稱之爲META表,隨着元數據的增長,META表會被分割成幾個HRegion,爲定位這些HRegion,需要一個表,這個表就稱之爲ROOT表,ROOT表不能被分割,永遠只存在一個,且名稱固定。

ZooKeeper

ZooKeeper集羣是協調系統,存儲的爲HBase中ROOT表和META表的位置,並負責監控機器狀態,當HMaster出故障後,ZooKpeer負責HMaster的恢復工作。

HBase的常用命令

以一個例子來展示HBase常用操作

Person 表內容如下:

這裏寫圖片描述

  1. 列出當前都有哪些表
$ show

這裏寫圖片描述
2. 創建表

$ create <table name>,<column family>,...
$ create 'person','private data','public data'

這裏寫圖片描述
3. 顯示錶的詳細信息

$ desc/describe <table name>
$ desc 'person'

這裏寫圖片描述
4. 插入數據

$ put <table name>,<row name>,<colfamily : colname>,<value>
$ put 'person','1','private data:age','25'
$ put 'person','1','private data:birthday','08-05'
$ put 'person','1','public data:name','xiaoming'
$ put 'person','1','public data:sex','man'
$ put 'person','2','private data:age','23'
$ put 'person','2','private data:birthday','04-20'
$ put 'person','2','public data:name','limei'
$ put 'person','2','public data:sex','woman'

這裏寫圖片描述
5. 更新數據
同插入數據,直接覆蓋原值就可以
6. 顯示已存在的數據

$ get <table name>,<row name>
$ get 'person','1'
$ get 'person','2'

這裏寫圖片描述
7. 刪除數據

$ delete <table name>,'row name',<colfamily : colname>,timestamp
$ delete all <table name>,'row name'
$ delete 'person','1','public data:name', 1501940429288
$ delete all 'person','1'

這裏寫圖片描述
這裏寫圖片描述
8. 刪除表

$ disable <table name> # 先禁用表
$ drop <table name>
$ disable 'person'
$ drop 'person'

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章