Hbase儲存格式
一、 Hbase儲存框架
1、 結構
HBase中的每張表都透過行鍵按照一定的範圍被分割成多個子表(HRegion),預設一個HRegion超過256M就要被分割成兩個,由HRegionServer管理,管理哪些HRegion由HMaster分配。
HRegionServer存取一個子表時,會建立一個HRegion物件,然後對錶的每個列族(Column Family)建立一個Store例項,每個Store都會有0個或多個StoreFile與之對應,每個StoreFile都會對應一個HFile, HFile就是實際的儲存檔案。因此,一個HRegion有多少個列族就有多少個Store。
另外,每個HRegion還擁有一個MemStore例項。
(發現上圖中一個錯誤,一個HRegionServer只對應一個HLog,也就是說同個HRegionServer中的HRegion共享一個HLog)
2、 流程
a) Client發起了一個HTable.put(Put)請求給HRegionServer
b) HRegionServer會將請求匹配到某個具體的HRegion上面
c) 決定是否寫WAL log。WAL log檔案是一個標準的Hadoop SequenceFile,檔案中儲存了HLogKey,這些Keys包含了和實際資料對應的序列號,主要用於崩潰恢復。
d) Put資料儲存到MemStore中,同時檢查MemStore狀態,如果滿了,則觸發Flush to Disk請求。
e) HRegionServer處理Flush to Disk的請求,將資料寫成HFile檔案並存到HDFS上,並且儲存最後寫入的資料序列號,這樣就可以知道哪些資料已經存入了永久儲存的HDFS中。
二、 Hbase儲存格式
HBase是基於BigTable的面向列的分散式儲存系統,其儲存設計是基於Memtable / SSTable設計的,主要分為兩部分,一部分為記憶體中的MemStore (Memtable),另外一部分為磁碟(這裡是HDFS)上的HFile (SSTable)。還有就是儲存WAL的log,主要實現類為HLog.
MemStore
MemStore原始碼:private final ConcurrentNavigableMap
本質上MemStore就是一個記憶體裡放著一個儲存KEY/VALUE的MAP,當MemStore(預設64MB)寫滿之後,會開始刷磁碟操作。
HFile結構
HFile是基於HADOOP TFile的,如圖2,檔案長度為變長,僅FILE INFO/Trailer定長,Trailer中有指標指向其他資料塊的起始點。Index資料塊記錄了每個Data塊和Meta塊的起始點。Data塊和Meta塊都是可有可無的,但對於大多數HFile,你都可以看到Data塊。
Data塊中,除了頭部的MAGIC之外,就是一對對KEY/VALUE對,結構如下:
關於檔案塊的大小:
預設塊大小64KB,在建立表時可以透過HColumnDescriptor設定每個Family的塊大小。
大資料塊:適合順序查詢,不適合隨機查詢。
小資料塊,適合隨機查詢,需要更多記憶體儲存Data Index,建立檔案慢,更多的flush操作
圖4 HFile總體結構圖
當key的value大小超過BLOCK SIZE時,那麼查詢這些value就無法透過索引去快速查詢,而是需要透過遍歷進行。
另外,針對目前針對現有HFile的兩個主要缺陷:
a) 暫用過多記憶體
b) 啟動載入時間緩慢
提出了HFile Version2設計:
https://issues.apache.org/jira/secure/attachment/12478329/hfile_format_v2_design_draft_0.1.pdf
HLog
HLog是HBase的日誌類,在寫入時進行write-ahead-log(WAL),主要為資料恢復。每個HRegionServer會對應一個HLog例項,HRegion在初始化的時候HRegionServer會將該HLog的例項作為建構函式傳入其中。HLog的核心函式是其append()函式。
HLog File 是一個Sequence File,只能在檔案的末尾新增內容。除了檔案頭以外,HLog File 由一條條HLog.Entry構成。Entry是HLog的基本組成部分,也是Read /Write的基本單位。
Entry由兩個部分組成:HLogKey和WALEdit。
HLogKey主要包含以下幾個變數:
private byte [] encodedRegionName;
private byte [] tablename;
private long logSeqNum; // Time at which this edit was written.
private long writeTime;
private byte clusterId;
logSeqNum是HLog 類的一個屬性,AtomicLong型別。每寫一個Entry就自動加1. 由於RS和HLog是一一對應的,所以logSeqNum是在RegionServer範圍內的自增量。
WALEdit的主體是一個KeyValue的List。在舊的版本中WALEdit只包含一個KeyValue,然而新的版本可以包含多個KeyValue,而且這些KeyValue可以擁有不同的RowKey。
圖5 HLog檔案結構圖
三、 HBase 預寫日誌 (WAL)
四、 HBase 索引
目前的HBase新版本沒有實現二級索引,以前hbase的版本有過二級索引,實現時也是寫寫資料再寫索引,索引放到後臺佇列中非同步地寫。實現最終一致。
HBase移走這塊程式碼的一個原因就是索引到底落後資料多少時間是不確定的,特別是在異常的情況下。這樣就導致在清理HLog時無法確定一個HLog是否真正全部寫入資料了。
關於HBase二級索引的一篇討論文章,參考:
問題:為什麼一個RegionServer 對應一個HLog,而不是一個region對應於一個log file?
BigTable論文答:如果每一個”tablet”(對應於HBase的region)都提交一個日誌檔案,會需要併發寫入大量的檔案到GFS(對應HDFS),這樣,根據每個GFS server所依賴的檔案系統,寫入不同的日誌檔案會造成大量的磁碟操作。
HBase依照這樣的原則。在日誌被回滾和安全刪除之前,將會有大量的檔案。如果改成一個region對應於一個檔案,將會不好擴充套件,會引發問題。
轉載請註明源:
http://asyty.iteye.com/blog/1250301
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15711267/viewspace-1063571/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HBase 資料儲存結構
- Mysql 行的儲存格式MySql
- Nebula Storage 2.0 儲存格式
- hive檔案儲存格式Hive
- 一文講清HBase儲存結構
- OceanBase 儲存層程式碼解讀(三)巨集塊儲存格式
- OceanBase 儲存層程式碼解讀(二)微塊儲存格式
- 一文講清HBase的儲存結構
- oracle儲存過程書寫格式Oracle儲存過程
- redis-5.資料儲存格式Redis
- 如何將網頁儲存成mhtml格式網頁HTML
- Greenplum 效能優化之路 --(二)儲存格式優化
- Spark原始碼編譯支援Parquet儲存格式Spark原始碼編譯
- 比較 Apache Hadoop 資料儲存格式 - techwellApacheHadoop
- OceanBase 原始碼解讀(九):儲存層程式碼解讀之「巨集塊儲存格式」原始碼
- 如何使用HBase?大資料儲存的兩個實戰場景大資料
- 塊儲存 檔案儲存 物件儲存物件
- vscode使用stylelint儲存自動格式化程式碼VSCode
- Spark+Hbase 億級流量分析實戰(日誌儲存設計)Spark
- 儲存—物件儲存_Minio物件
- electron-store會將資料儲存為什麼格式
- python本地儲存瀏覽器收藏夾網站mhtml格式Python瀏覽器網站HTML
- 行式儲存 列式儲存
- 分散式資料恢復-hbase+hive分散式儲存資料恢復方案分散式資料恢復Hive
- 面對海量資料儲存,如何保證HBase叢集的高效以及穩定
- flume日誌採集,hbase資料儲存,hive查詢輸出(簡單整合)Hive
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- Python匯入Excel表格資料並以字典dict格式儲存PythonExcel
- hive從入門到放棄(六)——常用檔案儲存格式Hive
- 資料儲存--檔案儲存
- 物件儲存 vs 檔案儲存 vs 塊儲存,選哪個?物件
- 儲存
- 用於初始化Xilinx 儲存 IP核的COE檔案格式
- Bond——大資料時代的資料交換和儲存格式大資料
- oracle使用儲存過程將表資料以excel格式匯出Oracle儲存過程Excel
- Redis序列化儲存及日期格式的問題處理EKDIRedis
- Kafka-之資料日誌儲存(格式變化與壓縮)Kafka
- Android儲存(2)– 介面卡儲存Android
- 儲存過程與儲存函式儲存過程儲存函式