Hbase常見問題


Hbase系統架構圖

hbase架構圖

1、數據熱點問題

產生數據熱點問題的原因:

(1)Hbase的數據是按照字典排序的,當大量連續的rowkey集中寫到個別的region,各個region之間實際分布不均衡;

(2)創建表時沒有提前預分區,創建的表默認只有一個region,大量的數據寫入當前region;

(3)創建表已經提前預分區,但是設計的rowkey沒有規律可循。

熱點問題的解決方案:

(1)隨機數+業務主鍵,如果更好的讓最近的數據get到,可以加上時間戳;

(2)Rowkey設計越短越好,不要超過10-100個字節;

(3)映射regionNo,這樣既可以讓數據均勻分布到各個region中,同時可以根據startkey和endkey可以個get到同一批數據。

2、描述hbase的rowkey的設計原理

三大設計原則:

(1)唯一性原則

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

(2)長度原則

rowkey是一個二進制碼流,可以是任意字符串,最大長度 64kb ,實際應用中一般為10-100bytes,以byte[] 形式保存,一般設計成定長。建議越短越好,不要超過16個字節,原因如下:數據的持久化文件HFile中是按照KeyValue存儲的,如果rowkey過長,比如超過100字節,1000w行數據,光rowkey就要占用100*1000w=10億個字節,將近1G數據,這樣會極大影響HFile的存儲效率;MemStore將緩存部分數據到內存,如果rowkey字段過長,內存的有效利用率就會降低,系統不能緩存更多的數據,這樣會降低檢索效率。目前操作系統都是64位系統,內存8字節對齊,控制在16個字節,8字節的整數倍利用了操作系統的最佳特性。

(3)散列原則

加鹽:如果rowkey按照時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將rowkey的高位作為散列字段,由程序隨機生成,低位放時間字段,這樣將提高數據均衡分布在每個RegionServer,以實現負載均衡的幾率。如果沒有散列字段,首字段直接是時間信息,所有的數據都會集中在一個RegionServer上,這樣在數據檢索的時候負載會集中在個別的RegionServer上,造成熱點問題,會降低查詢效率加鹽:這里所說的加鹽不是密碼學中的加鹽,而是在rowkey的前面增加隨機數,具體就是給rowkey分配一個隨機前綴以使得它和之前的rowkey的開頭不同。分配的前綴種類數量應該和你想使用數據分散到不同的region的數量一致。加鹽之后的rowkey就會根據隨機生成的前綴分散到各個region上,以避免熱點

哈希:哈希會使同一行永遠用一個前綴加鹽。哈希也可以使負載分散到整個集群,但是讀卻是可以預測的。使用確定的哈希可以讓客戶端重構完整的rowkey,可以使用get操作准確獲取某一個行數據

反轉:第三種防止熱點的方法時反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。反轉rowkey的例子以手機號為rowkey,可以將手機號反轉后的字符串作為rowkey,這樣的就避免了以手機號那樣比較固定開頭導致熱點問題

時間戳反轉:一個常見的數據處理問題是快速獲取數據的最近版本,使用反轉的時間戳作為rowkey的一部分對這個問題十分有用,可以用Long.Max_Value - timestamp 追加到key的末尾,例如key ,[key] 的最新值可以通過scan [key]獲得[key]的第一條記錄,因為HBase中rowkey是有序的,第一條記錄是最后錄入的數據。比如需要保存一個用戶的操作記錄,按照操作時間倒序排序,在設計rowkey的時候,可以這樣設計userId反轉,在查詢用戶的所有操作記錄數據的時候,直接指定反轉后的userId,startRow是userId反轉,stopRow是userId反轉如果需要查詢某段時間的操作記錄,startRow是user反轉,stopRow是userId反轉

3、hbase中compact的用途

在HBase中,每當memstore的數據flush到磁盤后,就形成一個storefile,當storefile的數量越來越大時,會嚴重影響HBase的讀性能 ,HBase內部的compact處理流程是為了解決MemStore Flush之后,文件數目太多,導致讀數據性能大大下降的一種自我調節手段,它會將文件按照某種策略進行合並,大大提升HBase的數據讀性能。

主要起到如下幾個作用

(1)合並文件

(2)清除刪除、過期、多余版本的數據

(3)提高讀寫數據的效率

這兩種compaction方式的區別是

1、Minor操作只用來做部分文件的合並操作以及包括minVersion=0並且設置ttl的過期版本清理,不做任何刪除數據、多版本數據的清理工作。

2、Major操作是對Region下的HStore下的所有StoreFile執行合並操作,最終的結果是整理合並出一個文件。

compaction觸發時機:

(1)Memstore刷寫后,判斷是否compaction

(2)CompactionChecker線程,周期輪詢

4、Hbase中regionserver掛了 如何恢復數據

引起RegionServer宕機的原因各種各樣,有因為Full GC導致、網絡異常導致、官方Bug導致(close wait端口未關閉)以及DataNode異常導致等等

HBase檢測宕機是通過Zookeeper實現的, 正常情況下RegionServer會周期性向Zookeeper發送心跳,一旦發生宕機,心跳就會停止,超過一定時間(SessionTimeout)Zookeeper就會認為RegionServer宕機離線,並將該消息通知給Master

一旦RegionServer發生宕機,HBase都會馬上檢測到這種宕機,並且在檢測到宕機之后會將宕機RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根據HLog進行丟失數據恢復,恢復完成之后就可以對外提供服務,整個過程都是自動完成的,並不需要人工介入.

img

5、簡單介紹Hbase的二級索引

默認情況下,Hbase只支持rowkey的查詢,對於多條件的組合查詢的應用場景,不夠給力。

如果將多條件組合查詢的字段都拼接在RowKey中顯然又不太可能

全表掃描再結合過濾器篩選出目標數據(太低效),所以通過設計HBase的二級索引來解決這個問題。

所謂的二級索引其實就是創建新的表,並建立各列值(family:column)與行鍵(rowkey)之間的映射關系。這種方式需要額外的存儲空間,屬於一種以空間換時間的方式

6、Hbase的優化

內存優化

垃圾回收優化:CMS, G1(Region)

JVM啟動:-Xms(1/64) –Xmx(1/4)

Region優化

預分區

禁用major合並,手動合並

客戶端優化

批處理

7、Hbase和mysql的區別

數據存儲方式:

mysql面向行存儲數據;

hbase面向列存儲數據,有利於壓縮和統計

數據之間的聯系:

mysql存儲關系型數據,結構化數據

Hbase存儲的非關系型數據,存儲結構化和非結構化數據

事務處理:

mysql數據庫存在事務,欣慰着重於計算

hbase數據庫側重於海量數據存儲,所以沒有事務概念

8、hbase如何導入數據

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

9、Hbase 和 hive 區別

共同點:

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 計算框架。

9、hbase 實時查詢的原理

實時查詢,可以認為是從內存中查詢,一般響應時間在 1 秒內。HBase 的機制是數據先寫入到內存中,當數據量達到一定的量(如 128M),再寫入磁盤中, 在內存中,是不進行數據的更新或合並操作的,只增加數據,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了 HBase I/O 的高性能。

10、Hbase中scan和get的功能以及實現的異同

HBase的查詢實現只提供兩種方式:

1、按指定RowKey 獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get) Get 的方法處理分兩種 : 設置了ClosestRowBefore 和沒有設置的rowlock .主要是用來保證行的事務性,即每個get 是以一個row 來標記的.一個row中可以有很多family 和column.

2、按指定的條件獲取一批記錄,scan方法(org.apache.Hadoop.hbase.client.Scan)實現條件查詢功能使用的就是scan 方式.

(1)scan 可以通過setCaching 與setBatch 方法提高速度(以空間換時間);

(2)scan 可以通過setStartRow 與setEndRow 來限定范圍([start,end)start 是閉區間, end 是開區間)。范圍越小,性能越高。

(3)scan 可以通過setFilter 方法添加過濾器,這也是分頁、多條件查詢的基礎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM