一、應用場景及特點
1. HBase能做什麼
海量數據存儲(百億*百萬)
準實時查詢(百毫秒查詢)-->1秒內完成查詢
2. 實際業務場景中的應用
交通:長江航道中船舶的GPS信息;路口攝像頭違章拍照
金融:存取款,借還款
電商:淘寶-》訂單,物流,瀏覽記錄
移動端:通話記錄等等
3.特點
海量存儲:(百億*百萬)傳統數據(單表500w,30列)
面向列:動態增加列;存儲和權限控制面向列--》只需要少數幾個字段的話,大大減少讀取的數據量
多版本:每一列的數據存儲有多個Version
稀疏性:爲空的列不佔用存儲空間,表可以很稀疏
擴展性:線性擴展,隨着數據量增多可以通過節點擴展進行支撐
高性能:
①底層LSM數據結構和Rowkey有序排列等架構上的獨特設計,使得HBase具有非常高的寫入能力。
②region切分、主鍵索引和緩存機制使得Hbase在海量數據下具備一定的隨機讀取性能,改性能針對Rowkey的查詢能夠到達毫秒級別
高可靠性:
4.優勢
不同點 |
傳統數據庫 |
Hbase |
海量存儲 |
500w*30時健康 |
百億*百萬 |
安全 |
不自帶備份 |
數據存儲在hdfs上,備份機制健全 |
準實時查詢 |
數據達到一定數量開始緩慢,很大的話基本無法支撐 |
通過zookeeper協調查找數據,訪問速度快 |
存儲方式 |
行存儲 |
列存儲 動態增加列 存儲和權限控制面向列 只需要少數幾個字段的話,大大減少讀取的數據量 |
數據較大時候的切分 |
人工第三方插件 |
自動(Region),也支持手動指定Region |
高併發讀寫 |
支持 |
不支持 |
5.劣勢
只支持rowkey匹配查詢,不支持條件查詢等複雜查詢
二、概念以及在Hadoop生態中的定義
1. HBase簡介
HBASE是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBASE技術可在廉價PC Server上搭建起大規模結構化存儲集羣。
HBASE的目標是存儲並處理大型的數據,更具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數據。
HBASE是Google Bigtable的開源實現,但是也有很多不同之處。
不同點 |
Google Bigtable |
HBASE |
文件存儲系統 |
GFS |
Hadoop HDFS |
協同服務 |
Chubby |
Zookeeper |
相同點 |
都採用Hadoop MapReduce來處海量數據 |
2. 概念介紹
1.1 Cell
由{row key,columnFamily,version} 唯一確定的單元。HBASE中通過rowkey和columns確定的爲一個存儲單元稱爲cell
cell中的數據是沒有類型的,全部是字節碼形式存儲。
關鍵字:無類型、字節碼
1.2 HRegionServer管理一系列HRegion(每個HRegion對應了Table中的一個Region)
HRegion中由多個HStore組成(每個HStore對應了Table中的一個Column Family的存儲)——可以看出每個ColumnFamily其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。
HStore存儲時HBas存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore*是Sorted Memory Buffer,
①用戶寫入數據首先會放入MemStore,
②當MemStore滿了以後會flush成一個*StoreFile(底層是HFile)
③當StoreFile文件數增長到一定閾值,會觸發Compact合併操作,將多個StoreFile合併成一個StoreFile,合併過程中會進行版本合併和數據刪除,因此可以看出HBase其實只有增加數據,所有的更新和刪除操作都是後續的compact過程中進行的,這使得用戶的寫操作只要進入內存中就可以立刻返回,保證了HBase IO的高性能
④當StoreFiles Compact後,會逐步形成越來越大的StoreFile,當單個StoreFile大小超過一定的閾值後,會觸發Split操作,同時,會把當前的Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到響應的HRegion Server上,使得原先1個Region的壓力得以分流道2個Region上
1.3 Hlog
HStore在系統正常工作的前提下是沒有問題的,但是在分佈式系統環境中,無法避免系統出錯或者宕機,一次一旦HRegion Server意外退出,MemStore中的內存數據將會丟失,這就需要引入HLog了
每一個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中,HLog文件定期會滾動出新的,並刪除舊的文件,當HRegionServer意外終止後,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應Region的目錄下,然後再將失效的Region重新分配,領取到這些Region的HRegionServer在LoadRegion過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。
1.4 ROOT表和META表
HBase中有兩張特殊的Table,-ROOT-和.META.
l .META.:記錄了用戶表的Region信息,.META.可以有多個regoin
l -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region
用戶表的Regions元數據被存儲在.META.表中,隨着Region的增多,.META.表中的數據也會增大,並分裂成多個Regions。爲了定位.META.表中各個Regions的位置,把.META.表中的所有Regions的元數據保存在-ROOT-表中,最後由Zookeeper記錄-ROOT-表的位置信息。所有客戶端訪問用戶數據前,需要首先訪問Zookeeper獲得-ROOT-的位置,然後方位-ROOT-表獲得.META.表的位置,最後根據.META.表中的信息確定用戶數據存放的位置,-ROOT-表永遠不會被分割,它只有一個Region,這樣可以保證最多需要三次跳轉就可以定位任意一個Region。爲了加快訪問速度,.META.表的Regions全部保存在內存中,如果.META.表中的每一行在內存中佔大約1KB,且每個Region限制爲128M,下圖中的三層結構可以保存Regions的數目爲(128M/1KB)*(128/1KB)=2^34個。
1.5 Zookeeper:
Zookeeper Quorum存儲-ROOT-表地址、HMaster地址
HRegionServer把自己以Ephedral方式註冊到Zookeeper中,HMaster隨時感知各個HRegionServer的健康狀況
Zookeeper避免HMaster單點問題
Zookeeper的主要作用:客戶端首先聯繫ZooKeeper子集羣(quorum)(一個由ZooKeeper節點組成的單獨集羣)查找行健。上述過程是通過ZooKeeper獲取含有-ROOT-的region服務器名(主機名)來完成的。通過含有-ROOT-的region服務器可以查詢到含有.META.表中對應的region服務器名,其中包含請求的行健信息。這兩處的主要內容都被緩存下來了,並且都只查詢一次。最終,通過查詢.META服務器來獲取客戶端查詢的行健數據所在region的服務器名。一旦知道了數據的實際位置,即region的位置,HBase會緩存這次查詢的信息,同時直接聯繫管理實際數據的HRegionServer。所以,之後客戶端可以通過緩存信息很好地定位所需的數據位置,而不用再次查找.META.表。
1.6 master
爲HRegionServer分配HRegion
平衡RegionServer的負載,使各個RegionServer管理的region個數大致相等
發現失效的RegionServer並重新分配失效上面的region到別的Regionserver
處理Schema更新請求(建表、刪表)
1.7
注意:region雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。region是由一個或者多個store組成的,每個store就是一個column family。每個store又由memStore和1至多個store file 組成(memstore到一個閥值會刷新,寫入到storefile,有hlog來保證數據的安全性,一個regionServer有且只有一個hlog)
2. 選擇合適的版本
官方版本:http://archive.apache.org/dist/hbase/
CDH版本:http://archive.cloudera.com/cdh5/
三、Hbase架構服務體系與設計模型
1. 服務體系:服務包含哪些進程,進程與進程之間的關係,以及hbase在生態中的關係)
RegionServer向Master彙報:
①健康狀態②管理哪些Region(表大的時候進行分區,一個分區就是一個Region)
注意:Zookeeper也知道RegionServer的以上信息
2. 設計模型:表結構模型 和 表數據模型
表結構模型
建表時候定列簇,不用定列
數據模型
- 一張表的列簇不會超過5個
- 每個列簇的列數沒有限制
- 列只有插入數據後存在
- 列在列簇中是有序的
四、安裝部署
參照《HBase安裝部署》
1. 先決條件
- JDK1.7 +
- Hadoop-2.5.0 +
- Zookeeper-3.4.5 +
五、HBase shell使用
參照《HBase遠程連接+常用命令》