HBase 相關知識

 

HBase總結(九)Bloom Filter概念和原理

https://blog.csdn.net/lifuxiangcaohui/article/details/39991781

 

1. Hbase是什麼?hbase的特點是什麼?

Hbase一個分佈式的基於列式存儲的數據庫,基於Hadoop的 hdfs 存儲,zookeeper 進行管理。
Hbase適合存儲半結構化或非結構化數據,對於數據結構字段不夠確定或者雜亂無章很難按一個概念去抽取的數據。
Hbase 爲 null 的記錄不會被存儲。
基於的表包含 rowkey,時間戳,和列族。新寫入數據時,時間戳更新, 同時可以查詢到以前的版本。
hbase 是主從架構。hmaster 作爲主節點,hregionserver 作爲從節點。


2. hbase如何導入數據?

通過HBase API進行批量寫入數據;
使用Sqoop工具批量導數到HBase集羣;
使用MapReduce批量導入;
HBase BulkLoad的方式。


3. hbase 的存儲結構?
Hbase 中的每張表都通過行鍵 (rowkey) 按照一定的範圍被分割成多個子表(HRegion),默認一個 HRegion 超過 256M 就要被分割成兩個,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分配。 HRegion 存取一個子表時,會創建一個 HRegion 對象,然後對錶的每個列族 (Column Family) 創建一個 store 實例, 每個 store 都會有 0個或多個 StoreFile 與之對應,每個 StoreFile 都會對應一個 HFile , HFile 就是實際的存儲文件,因此,一個 HRegion 還擁有一個 MemStore 實例。

4. Hbase 和 hive 有什麼區別?hive 與 hbase 的底層存儲是什麼?hive 是產生的原因是什麼?habase 是爲了彌補 hadoop 的什麼缺陷?
共同點:

hbase與hive都是架構在hadoop之上的。都是用hadoop作爲底層存儲。

區別:

Hive是建立在Hadoop之上爲了減少MapReducejobs編寫工作的批處理系統,HBase是爲了支持彌補Hadoop對實時操作的缺陷的項目 。
想象你在操作RMDB數據庫,如果是全表掃描,就用Hive+Hadoop,如果是索引訪問,就用HBase+Hadoop;
Hive query就是MapReduce jobs可以從5分鐘到數小時不止,HBase是非常高效的,肯定比Hive高效的多;
Hive本身不存儲和計算數據,它完全依賴於 HDFS 和 MapReduce,Hive中的表純邏輯;
hive借用hadoop的MapReduce來完成一些hive中的命令的執行;
hbase是物理表,不是邏輯表,提供一個超大的內存hash表,搜索引擎通過它來存儲索引,方便查詢操作;
hbase是列存儲;
hdfs 作爲底層存儲,hdfs 是存放文件的系統,而 Hbase 負責組織文件;
hive 需要用到 hdfs 存儲文件,需要用到 MapReduce 計算框架。


5. 解釋下 hbase 實時查詢的原理
實時查詢,可以認爲是從內存中查詢,一般響應時間在 1 秒內。HBase 的機制是數據先寫入到內存中,當數據量達到一定的量(如 128M),再寫入磁盤中, 在內存中,是不進行數據的更新或合併操作的,只增加數據,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了 HBase I/O 的高性能。
6. 描述 Hbase 的 rowKey 的設計原則
聯繫 region 和 rowkey 關係說明,設計可參考以下三個原則.


rowkey 長度原則
rowkey 是一個二進制碼流,可以是任意字符串,最大長度 64kb,實際應用中一般爲 10-100bytes,以  byte[] 形式保存,一般設計成定長。建議越短越好,不要超過 16 個字節, 原因如下:
數據的持久化文件 HFile 中是按照 KeyValue 存儲的,如果 rowkey 過長會極大影響 HFile 的存儲效率 MemStore 將緩存部分數據到內存,如果 rowkey 字段過長,內存的有效利用率就會降低,系統不能緩存更多的數據,這樣會降低檢索效率


rowkey 散列原則
如果 rowkey 按照時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將 rowkey 的高位作爲散列字段,由程序隨機生成,低位放時間字段,這樣將提高數據均衡分佈在每個 RegionServer,以實現負載均衡的機率。如果沒有散列字段,首字段直接是時間信息,所有的數據都會集中在一個 RegionServer 上,這樣在數據檢索的時候負載會集中在個別的 RegionServer 上,造成熱點問題,會降低查詢效率。


rowkey 唯一原則
必須在設計上保證其唯一性,rowkey 是按照字典順序排序存儲的,因此, 設計 rowkey 的時候,要充分利用這個排序的特點,將經常讀取的數據存儲到一塊,將最近可能會被訪問的數據放到一塊。

 

7. 描述 Hbase 中 scan 和 get 的功能以及實現的異同

按指 定 RowKey 獲 取 唯 一 一 條 記 錄 , get 方法( org.apache.hadoop.hbase.client.Get ) Get的方法處理分兩種 : 設置了ClosestRowBefore和沒有設置的 rowlock 主要是用來保證行的事務性,即每個get 是以一個 row 來標記的.一個 row 中可以有很多 family 和 column。
按指定的條件獲取一批記錄,scan 方法(org.apache.Hadoop.hbase.client.Scan)實現條件查詢功能使用的就是 scan 方式

 

scan 可以通過 setCaching 與 setBatch 方法提高速度(以空間換時間);
scan 可以通過 setStartRow 與 setEndRow 來限定範圍([start,end]start? 是閉區間,end 是開區間)。範圍越小,性能越高;
scan 可以通過 setFilter 方法添加過濾器,這也是分頁、多條件查詢的基礎。 3.全表掃描,即直接掃描整張表中所有行記錄。

 

8. 請詳細描述 Hbase 中一個 Cell 的結構
HBase 中通過 row 和 columns 確定的爲一個存貯單元稱爲 cell。Cell:由{row key, column(= + ), version}是唯一確定的單元cell 中的數據是沒有類型的,全部是字節碼形式存貯。

9. 簡述 HBASE 中 compact 用途是什麼,什麼時候觸發,分爲哪兩種,有什麼區別,有哪些相關配置參數?
在 hbase 中每當有 memstore 數據 flush 到磁盤之後,就形成一個 storefile, 當 storeFile 的數量達到一定程度後,就需要將 storefile 文件來進行 compaction 操作。Compact 的作用:

合併文件
清除過期,多餘版本的數據
提高讀寫數據的效率


10. HBase 中實現了兩種 compaction 的方式 : minor and major這兩種compaction 方式的區別是:

Minor 操作:只合並小文件,對TTL過期數據設置過期清理,不會對文件內容進行清除操作
Major 操作:對 Region 下同一個 Column family 的 StoreFile 合併爲一個大文件,並且清除刪除、過期、多餘版本的數據


11. 簡述 Hbase filter 的實現原理是什麼?結合實際項目經驗,寫出幾個使用filter 的場景。
HBase 爲篩選數據提供了一組過濾器,通過這個過濾器可以在 HBase 中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵, 列名,時間戳定位)。
RowFilter、PrefixFilter。hbase 的 filter 是通過 scan 設置的,所以是基於 scan 的查詢結果進行過濾. 過濾器的類型很多,但是可以分爲兩大類——比較過濾器,專用過濾器。過濾器的作用是在服務端判斷數據是否滿足條件,然後只將滿足條件的數據返回給客戶端;如在進行訂單開發的時候,我們使用 rowkeyfilter 過濾出某個用戶的所有訂單。

12. Hbase 內部是什麼機制?
在 HBase 中無論是增加新行還是修改已有的行,其內部流程都是相同的。HBase 接到命令後存下變化信息,或者寫入失敗拋出異常。默認情況下,執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱 HLog)和 MemStore。HBase 的默認方式是把寫入動作記錄在這兩個地方,以保證數據持久化。只有當這兩個地方的變化信息都寫入並確認後,才認爲寫動作完成。
MemStore 是內存裏的寫入緩衝區,HBase 中數據在永久寫入硬盤之前在這裏累積。當MemStore 填滿後,其中的數據會刷寫到硬盤,生成一個HFile。HFile 是HBase 使用的底層存儲格式。HFile 對應於列族,一個列族可以有多個 HFile,但一個 HFile 不能存儲多個列族的數據。在集羣的每個節點上,每個列族有一個MemStore。大型分佈式系統中硬件故障很常見,HBase 也不例外。
設想一下,如果MemStore 還沒有刷寫,服務器就崩潰了,內存中沒有寫入硬盤的數據就會丟失。HBase 的應對辦法是在寫動作完成之前先寫入 WAL。HBase 集羣中每臺服務器維護一個 WAL 來記錄發生的變化。WAL 是底層文件系統上的一個文件。直到WAL 新記錄成功寫入後,寫動作才被認爲成功完成。這可以保證 HBase 和支撐它的文件系統滿足持久性。
大多數情況下,HBase 使用Hadoop分佈式文件系統(HDFS)來作爲底層文件系統。如果 HBase 服務器宕機,沒有從 MemStore 裏刷寫到 HFile 的數據將可以通過回放 WAL 來恢復。你不需要手工執行。Hbase 的內部機制中有恢復流程部分來處理。每臺 HBase 服務器有一個 WAL,這臺服務器上的所有表(和它們的列族)共享這個 WAL。你可能想到,寫入時跳過 WAL 應該會提升寫性能。但我們不建議禁用 WAL, 除非你願意在出問題時丟失數據。如果你想測試一下,如下代碼可以禁用 WAL: 注意:不寫入 WAL 會在 RegionServer 故障時增加丟失數據的風險。關閉 WAL, 出現故障時 HBase 可能無法恢復數據,沒有刷寫到硬盤的所有寫入數據都會丟失。

13. HBase 宕機如何處理?
宕機分爲 HMaster 宕機和 HRegisoner 宕機.
如果是 HRegisoner 宕機,HMaster 會將其所管理的 region 重新分佈到其他活動的 RegionServer 上,由於數據和日誌都持久在 HDFS 中,該操作不會導致數據丟失,所以數據的一致性和安全性是有保障的。
如果是 HMaster 宕機, HMaster 沒有單點問題, HBase 中可以啓動多個HMaster,通過 Zookeeper 的 Master Election 機制保證總有一個 Master 運行。即ZooKeeper 會保證總會有一個 HMaster 在對外提供服務。

14. HRegionServer宕機如何處理?

ZooKeeper 會監控 HRegionServer 的上下線情況,當 ZK 發現某個 HRegionServer 宕機之後會通知 HMaster 進行失效備援;
HRegionServer 會停止對外提供服務,就是它所負責的 region 暫時停止對外提供服務
HMaster 會將該 HRegionServer 所負責的 region 轉移到其他 HRegionServer 上,並且會對 HRegionServer 上存在 memstore 中還未持久化到磁盤中的數據進行恢復;
這個恢復的工作是由 WAL重播 來完成,這個過程如下:

 

wal實際上就是一個文件,存在/hbase/WAL/對應RegionServer路徑下
宕機發生時,讀取該RegionServer所對應的路徑下的wal文件,然後根據不同的region切分成不同的臨時文件recover.edits
當region被分配到新的RegionServer中,RegionServer讀取region時會進行是否存在recover.edits,如果有則進行恢復

 

15 hbase寫數據 和 讀數據過程
獲取region存儲位置信息
寫數據和讀數據一般都會獲取hbase的region的位置信息。大概步驟爲:

從zookeeper中獲取.ROOT.表的位置信息,在zookeeper的存儲位置爲/hbase/root-region-server;
根據.ROOT.表中信息,獲取.META.表的位置信息;
META.表中存儲的數據爲每一個region存儲位置;

向hbase表中插入數據
hbase中緩存分爲兩層:Memstore 和 BlockCache

首先寫入到 WAL文件 中,目的是爲了數據不丟失;
再把數據插入到 Memstore緩存中,當 Memstore達到設置大小閾值時,會進行flush進程;
flush過程中,需要獲取每一個region存儲的位置。

從hbase中讀取數據
BlockCache 主要提供給讀使用。讀請求先到 Memtore中查數據,查不到就到 BlockCache  中查,再查不到就會到磁盤上讀,並把讀的結果放入 BlockCache 。
BlockCache  採用的算法爲 LRU(最近最少使用算法),因此當 BlockCache  達到上限後,會啓動淘汰機制,淘汰掉最老的一批數據。
一個 RegionServer 上有一個  BlockCache   和N個 Memstore,它們的大小之和不能大於等於 heapsize * 0.8,否則 hbase 不能啓動。默認 BlockCache    爲 0.2,而 Memstore 爲 0.4。對於注重讀響應時間的系統,應該將 BlockCache 設大些,比如設置BlockCache =0.4,Memstore=0.39。這會加大緩存命中率。

15. HBase優化方法
優化手段主要有以下四個方面
1. 減少調整
減少調整這個如何理解呢?HBase中有幾個內容會動態調整,如region(分區)、HFile,所以通過一些方法來減少這些會帶來I/O開銷的調整
Region
如果沒有預建分區的話,那麼隨着region中條數的增加,region會進行分裂,這將增加I/O開銷,所以解決方法就是根據你的RowKey設計來進行預建分區,減少region的動態分裂。
HFile
HFile是數據底層存儲文件,在每個memstore進行刷新時會生成一個HFile,當HFile增加到一定程度時,會將屬於一個region的HFile進行合併,這個步驟會帶來開銷但不可避免,但是合併後HFile大小如果大於設定的值,那麼HFile會重新分裂。爲了減少這樣的無謂的I/O開銷,建議估計項目數據量大小,給HFile設定一個合適的值
2. 減少啓停
數據庫事務機制就是爲了更好地實現批量寫入,較少數據庫的開啓關閉帶來的開銷,那麼HBase中也存在頻繁開啓關閉帶來的問題。


關閉Compaction,在閒時進行手動Compaction
因爲HBase中存在Minor Compaction和Major Compaction,也就是對HFile進行合併,所謂合併就是I/O讀寫,大量的HFile進行肯定會帶來I/O開銷,甚至是I/O風暴,所以爲了避免這種不受控制的意外發生,建議關閉自動Compaction,在閒時進行compaction


批量數據寫入時採用BulkLoad
如果通過HBase-Shell或者JavaAPI的put來實現大量數據的寫入,那麼性能差是肯定並且還可能帶來一些意想不到的問題,所以當需要寫入大量離線數據時建議使用BulkLoad


3. 減少數據量
雖然我們是在進行大數據開發,但是如果可以通過某些方式在保證數據準確性同時減少數據量,何樂而不爲呢?


開啓過濾,提高查詢速度
開啓BloomFilter,BloomFilter是列族級別的過濾,在生成一個StoreFile同時會生成一個MetaBlock,用於查詢時過濾數據


使用壓縮:一般推薦使用Snappy和LZO壓縮


4. 合理設計
在一張HBase表格中RowKey和ColumnFamily的設計是非常重要,好的設計能夠提高性能和保證數據的準確性

RowKey設計:應該具備以下幾個屬性


散列性:散列性能夠保證相同相似的rowkey聚合,相異的rowkey分散,有利於查詢
簡短性:rowkey作爲key的一部分存儲在HFile中,如果爲了可讀性將rowKey設計得過長,那麼將會增加存儲壓力
唯一性:rowKey必須具備明顯的區別性
業務性:舉些例子
假如我的查詢條件比較多,而且不是針對列的條件,那麼rowKey的設計就應該支持多條件查詢
如果我的查詢要求是最近插入的數據優先,那麼rowKey則可以採用叫上Long.Max-時間戳的方式,這樣rowKey就是遞減排列

 

列族的設計
列族的設計需要看應用場景
多列族設計的優劣
優勢:
HBase中數據時按列進行存儲的,那麼查詢某一列族的某一列時就不需要全盤掃描,只需要掃描某一列族,減少了讀I/O;
其實多列族設計對減少的作用不是很明顯,適用於讀多寫少的場景。
劣勢:
降低了寫的I/O性能。原因如下:數據寫到store以後是先緩存在memstore中,同一個region中存在多個列族則存在多個store,每個store都一個memstore,當其實memstore進行flush時,屬於同一個region
的store中的memstore都會進行flush,增加I/O開銷。

 

16. 爲什麼不建議在 HBase 中使用過多的列族
在 Hbase 的表中,每個列族對應 Region 中的一個Store,Region的大小達到閾值時會分裂,因此如果表中有多個列族,則可能出現以下現象:


一個Region中有多個Store,如果每個CF的數據量分佈不均勻時,比如CF1爲100萬,CF2爲1萬,則Region分裂時導致CF2在每個Region中的數據量太少,查詢CF2時會橫跨多個Region導致效率降低。


如果每個CF的數據分佈均勻,比如CF1有50萬,CF2有50萬,CF3有50萬,則Region分裂時導致每個CF在Region的數據量偏少,查詢某個CF時會導致橫跨多個Region的概率增大。


多個CF代表有多個Store,也就是說有多個MemStore(2MB),也就導致內存的消耗量增大,使用效率下降。


Region 中的 緩存刷新 和 壓縮 是基本操作,即一個CF出現緩存刷新或壓縮操作,其它CF也會同時做一樣的操作,當列族太多時就會導致IO頻繁的問題。
————————————————
版權聲明:本文爲CSDN博主「super_man_0820」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/super_wj0820/article/details/97876129

 

 

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