作者:攻城蝨
原文:https://blog.csdn.net/u011583316/article/details/84445735
Hbase
![重溫大數據——Hbase部署以及架構分析](http://p2.ttnews.xyz/loading.gif)
HBase是一個分佈式的、面向列的開源數據庫,該技術來源於 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化數據的分佈式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分佈式數據存儲一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是HBase基於列的而不是基於行的模式。-- 百度百科
簡單的說HBase就是一個分佈式的可擴展的大數據量的非關係型數據庫(NoSQL)。它具有一般的關係型數據Oracle/MySQL的基礎功能如:
- 存儲數據
- 檢索數據
- 查詢數據
Hbase能做的什麼
Hbase 作為一個非關係型數據庫,首先就是對數據的基礎的存儲,其次是可以提供傳統關係型數據庫達不到的億級數據量實時的查詢。
- 海量數據的存儲
- 海量數據的查詢
Hbase在上億的數據表裡能做到秒級別查詢(實時查詢)
Hbase使用場景
- 交通數據
- 賬單數據
- 遊戲數據
- 電商交易數據
一切大數據量的,對實時查詢依賴高的的場景都能解決。
Hbase在生態圈中的位置
圖中可見,Hbase是基於HDFS的,也就是說Hbase的數據是存儲在HDFS上面的,它可以很好地繼承MapReduce和Hive來進行數據的處理。
![重溫大數據——Hbase部署以及架構分析](http://p2.ttnews.xyz/loading.gif)
Hbase數據存儲方式存儲
Hbase是非關係型數據庫中典型的列式存儲數據庫
Hbase數據的組成元素
Hbase中數據是以字節數組進行存儲,不存在數據類型。默認數據三份(HDFS)並且每條數據有唯一的標識符。
rowkey + columnfamily(列蔟) + column01(列名) + timestamp(時間戳) : value (值) => cell (單元)
- Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序
- Timestamp: 時間戳,每次數據操作對應的時間戳,可以看作是數據的version number
- Column Family:列簇,Table在水平方向有一個或者多個Column Family組成,一個Column Family中可以由任意多個Column組成,即Column Family支持動態擴展,無需預先定義Column的數量以及類型,所有Column均以二進制格式存儲,用戶需要自行進行類型轉換。
為什麼Hbase能這麼快呢?
關鍵點在於表中rowkey的設計。
1、hbase是可劃分成多個region。
2、rowkey是排好序了的。
3、數據是按列存儲的。
- 首先,能快速找到行所在的region(分區),假設表有10億條記錄,佔空間1TB, 分列成了500個region, 1個region佔2個G. 最多讀取2G的記錄,就能找到對應記錄
- 其次,是按列存儲的,其實是列族,假設分為3個列族,每個列族就是666M, 如果要查詢的東西在其中1個列族上,1個列族包含1個或者多個HStoreFile,假設一個HStoreFile是128M, 該列族包含5個HStoreFile在磁盤上. 剩下的在內存中。
- 再次,是排好序了的,你要的記錄有可能在最前面,也有可能在最後面,假設在中間,我們只需遍歷2.5個HStoreFile共300M
- 最後,每個HStoreFile(HFile的封裝),是以鍵值對(key-value)方式存儲,只要遍歷一個個數據塊中的key的位置,並判斷符合條件可以了。 一般key是有限的長度,假設跟value是1:19(忽略HFile上其它塊),最終只需要15M就可獲取的對應的記錄,按照磁盤的訪問100M/S,只需0.15秒。 加上塊緩存機制(LRU原則),會取得更高的效率。
Hbase的數據模型
Hbase架構
圖中可見HDFS,Zookeeper。Hbase有多少個RS,其管理的內容都存在ZK的ZNode上面,ZK可以幫助用戶找到某張表在哪個RS,做一個檢索功能。架構的詳細,請往後面看。
Hbase安裝部署
- 解壓安裝,不必多說
- 配置hbase-env.sh 配置JDK
- 配置hbase-site.xml 設置HDFS上hbase數據存儲目錄,
同時關閉默認ZK管理,由我們啟動自己安裝的ZK。註釋掉就行。
hbase-env.sh
# export HBASE_MANAGES_ZK=true
- 修改 regionservers
* zookeeper
* namenode
* datanode
* HM
- 訪問Web頁面 端口號60010
各個目錄的含義(官方文檔):
1./.tmp 這個目錄用來存儲臨時文件,當對錶進行操作的時候,首先會將表移動到該目錄下,然後再進行操作。
2./WALs WAL意為Write ahead log用來做災難恢復。被HLog實例管理的WAL文件。
3./data hbase 的核心目錄,系統會預置兩個 namespace 即:hbase和default。/data/hbase 存儲了存儲了 HBase 的 namespace、meta 兩個系統級表。namespace 中存儲了 HBase 中的所有 namespace 信息,包括預置的hbase 和 default。/data/default/ 存儲所有用戶數據表/data/default/表名。
4./hbase.id 存儲集群唯一的 cluster id 號,是一個 uuid。
5./hbase.version 同樣也是一個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來。 6./oldWALs 當/WALs 中的HLog文件被持久化到存儲文件中,不再需要日誌文件時,它們會被移動到/oldWALs目錄。
注意 :如果有需要的話就換hadoop的jar,替換Hadoop的版本。
Hbase Shell使用
- list 查看錶
- help ‘’查看幫助細節 help ‘create’
- 創建表 create ‘user’,‘info’
- 描述表 describe ‘user’
- 插數據 put ‘user’,‘1001’,‘info:name’,‘xianglei’ (表名,rowkey,列蔟:列名,值)
- 查看數據(三種方式)
- 依據rowkey查詢,最快的
- 從memstore寫到storefile flush ‘user’
- 手動compact compact ‘user’
查看數據
get
範圍查詢(用的最多)
scan ‘user’,{STARTROW=>‘1002’}
全表掃描
scan
刪除數據
delete ‘user’,‘1001’,‘info:name’
deleteall ‘user’,‘1001’
刪除所有數據
刪除表
刪除前,必須先disable
表的啟用禁用
禁用
啟用
Hbase 物理模型
說說Hbase中數據存儲的物理模型。數據是怎麼在Hbase中存儲的。簡單來說是按rowkey來進行動態分區(region)存儲的。
細節說明:
每個columnfamily存儲在HDFS上的一個單獨文件中;Key 和 Version number在每個 column family中均由一份;空值不會被保存。
HBase數據寫入流程
put —> cell - wal(預寫日誌) -> hdfs- memstore(溢寫)- storefile -> hdfs
細節描述
- Client通過Zookeeper的調度,向RegionServer發出寫數據請求,在Region中寫數據;
- 數據被寫入Region的MemStore,知道MemStore達到預設閥值(即MemStore滿);
- MemStore中的數據被Flush成一個StoreFile;
- 隨著StoreFile文件的不斷增多,當其數量增長到一定閥值後,觸發Compact合併操作,將多個StoreFile合併成一個StoreFile,同時進行版本合併和數據刪除;
- StoreFiles通過不斷的Compact合併操作,逐步形成越來越大的StoreFile;
- 單個StoreFile大小超過一定閥值後,觸發Split操作,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
可以看出HBase只有增添數據,所有的更新和刪除操作都是在後續的Compact歷程中舉行的,使得用戶的寫操作只要進入內存就可以立刻返回,實現了HBase I/O的高性能。
HBase數據讀取流程
數據讀取:先到memstore讀(沒有溢寫到)再到storefile最後合併。
細節描述
- Client訪問Zookeeper,獲取.META.表信息;
- 從.META.表查找,獲取存放目標數據的Region信息,從而找到對應的RegionServer;
- 通過RegionServer獲取需要查找的數據;
- RegionServer的內存分為MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求先到MemStore中查數據,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,並把讀的結果放入BlockCache。
尋址過程:client—>Zookeeper–>.META. 表–>RegionServer—>Region–>User Table—>client
Hbase Region理解
Hbase 架構細節
這張圖有一個缺陷就是,Hbase中一個Hlog是管理的一個HRegionServer的,不是一個HRegion。
Hbase讀取數據流程說明:
客戶端讀取數據首先連接ZK,他需要去ZK找到這個表(region)所在的位置。
這裡Zk存儲了下圖內容:
然後去meta表掃描信息,比如找到user的rowkey然後找到他對應的region,得到管理他的regionserver。
Master需要連接ZK是因為他需要知道哪些RS是活著的。
特殊說明:
- 有幾個列蔟就有幾個Store,Store裡面有一個memstore和很多個storeFile。
- Hlog存在的意義是,當集群突然掛掉memstore數據丟失後,當重啟機器時Hlog重新讀取文件系統的數據,並且恢復回來。
RS->一個RS對應一個目錄
meta-region-server
存儲meta表對應的region被哪個regionserver管理的信息
HBase新版本中,有了類似於RDBMS中DataBase的概念
命令空間
- 用戶自定義的表,默認情況下命名空間
default
- 系統自帶的元數據表的命名空間
hbase
總結
Hbase這一塊需要學習的內容很多很多。這一節主要就是說說Hbase的一些基礎特性,shell,以及Hbase的架構分析。內容雖然看著比較多,但是肯定也不全,暫時就記錄這麼多,如有需要再去看官方文檔。深入學習必不可少。
閱讀更多 javafirst 的文章