HBase優化

1 高可用

在HBase中Hmaster負責監控RegionServer的生命週期,均衡RegionServer的負載,若是Hmaster掛掉了,那麼整個HBase集羣將陷入不健康的狀態,而且此時的工做狀態並不會維持過久。因此HBase支持對Hmaster的高可用配置。node

1.關閉HBase集羣(若是沒有開啓則跳過此步)linux

[FLY@hadoop102 hbase]$ bin/stop-hbase.sh算法

2.在conf目錄下建立backup-masters文件apache

[FLY@hadoop102 hbase]$ touch conf/backup-masters數組

3.在backup-masters文件中配置高可用HMaster節點緩存

[FLY@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters

4.將整個conf目錄scp到其餘節點app

[FLY@hadoop102 hbase]$ scp -r conf/ hadoop103:/opt/module/hbase/
[FLY@hadoop102 hbase]$ scp -r conf/ hadoop104:/opt/module/hbase/

5.打開頁面測試查看框架

http://hadooo102:16010異步

2 預分區

每個region維護着startRowendRowKey,若是加入的數據符合某個region維護的rowKey範圍,則該數據交給這個region維護。那麼依照這個原則,咱們能夠將數據所要投放的分區提早大體的規劃好,以提升HBase性能。socket

1.手動設定預分區

hbase> create 'staff1','info','partition1',SPLITS => ['1000','2000','3000','4000']

2.生成16進制序列預分區

create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

 

 

3.按照文件中設置的規則預分區

 

建立splits.txt文件內容以下:

aaaa
bbbb
cccc
dddd

而後執行:

create 'staff3','partition3',SPLITS_FILE => 'splits.txt'

 

4.使用JavaAPI建立預分區

//自定義算法,產生一系列Hash散列值存儲在二維數組中
byte[][] splitKeys = 某個散列值函數
//建立HBaseAdmin實例
HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());
//建立HTableDescriptor實例
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
//經過HTableDescriptor實例和散列值二維數組建立帶有預分區的HBase表
hAdmin.createTable(tableDesc, splitKeys);

3 RowKey設計

一條數據的惟一標識就是rowkey,那麼這條數據存儲於哪一個分區,取決於rowkey處於哪一個一個預分區的區間內,設計rowkey的主要目的 ,就是讓數據均勻的分佈於全部的region中,在必定程度上防止數據傾斜。接下來咱們就談一談rowkey經常使用的設計方案。

1.生成隨機數、hash、散列值

好比:
本來rowKey爲1001的,SHA1後變成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
本來rowKey爲3001的,SHA1後變成:49042c54de64a1e9bf0b33e00245660ef92dc7bd
本來rowKey爲5001的,SHA1後變成:7b61dec07e02c188790670af43e717f0f46e8913
在作此操做以前,通常咱們會選擇從數據集中抽取樣本,來決定什麼樣的rowKey來Hash後做爲每一個分區的臨界值。

2.字符串反轉

20170524000001轉成10000042507102
20170524000002轉成20000042507102

 

這樣也能夠在必定程度上散列逐步put進來的數據。

3.字符串拼接

20170524000001_a12e
20170524000001_93i7

4 內存優化

HBase操做過程當中須要大量的內存開銷,畢竟Table是能夠緩存在內存中的,通常會分配整個可用內存的70%給HBase的Java堆。可是不建議分配很是大的堆內存,由於GC過程持續過久會致使RegionServer處於長期不可用狀態,通常16~48G內存就能夠了,若是由於框架佔用內存太高致使系統內存不足,框架同樣會被系統服務拖死。

5 基礎優化

容許在HDFS的文件中追加內容

hdfs-site.xml、hbase-site.xml

屬性:dfs.support.append
解釋:開啓HDFS追加同步,能夠優秀的配合HBase的數據同步和持久化。默認值爲true。

2.優化DataNode容許的最大文件打開數

hdfs-site.xml

屬性:dfs.datanode.max.transfer.threads
解釋:HBase通常都會同一時間操做大量的文件,根據集羣的數量和規模以及數據動做,設置爲4096或者更高。默認值:4096

3.優化延遲高的數據操做的等待時間

屬性:dfs.image.transfer.timeout
解釋:若是對於某一次數據操做來說,延遲很是高,socket須要等待更長的時間,建議把該值設置爲更大的值(默認60000毫秒),以確保socket不會被timeout掉。

 

4.優化數據的寫入效率

mapred-site.xml

屬性:
mapreduce.map.output.compress
mapreduce.map.output.compress.codec
解釋:開啓這兩個數據能夠大大提升文件的寫入效率,減小寫入時間。第一個屬性值修改成true,第二個屬性值修改成:org.apache.hadoop.io.compress.GzipCodec或者其餘壓縮方式。

 

5.設置RPC監聽數量

hbase-site.xml

屬性:hbase.regionserver.handler.count
解釋:默認值爲30,用於指定RPC監聽的數量,能夠根據客戶端的請求數進行調整,讀寫請求較多時,增長此值。

6.優化HStore文件大小

hbase-site.xml

屬性:hbase.hregion.max.filesize
解釋:默認值10737418240(10GB),若是須要運行HBase的MR任務,能夠減少此值,由於一個region對應一個map任務,若是單個region過大,會致使map任務執行時間過長。該值的意思就是,若是HFile的大小達到這個數值,則這個region會被切分爲兩個Hfile。

 

7.優化hbase客戶端緩存

hbase-site.xml

屬性:hbase.client.write.buffer
解釋:用於指定HBase客戶端緩存,增大該值能夠減小RPC調用次數,可是會消耗更多內存,反之則反之。通常咱們須要設定必定的緩存大小,以達到減小RPC次數的目的。

 

8.指定scan.next掃描HBase所獲取的行數

hbase-site.xml

屬性:hbase.client.scanner.caching
解釋:用於指定scan.next方法獲取的默認行數,值越大,消耗內存越大。

 

9.flush、compact、split機制

當MemStore達到閾值,將Memstore中的數據Flush進Storefile;compact機制則是把flush出來的小文件合併成大的Storefile文件。split則是當Region達到閾值,會把過大的Region一分爲二。

涉及屬性:

即:128M就是Memstore的默認閾值

hbase.hregion.memstore.flush.size:134217728

即:這個參數的做用是當單個HRegion內全部的Memstore大小總和超過指定值時,flush該HRegion的全部memstore。RegionServer的flush是經過將請求添加一個隊列,模擬生產消費模型來異步處理的。那這裏就有一個問題,當隊列來不及消費,產生大量積壓請求時,可能會致使內存陡增,最壞的狀況是觸發OOM。

hbase.regionserver.global.memstore.upperLimit:0.4
hbase.regionserver.global.memstore.lowerLimit:0.38

即:當MemStore使用內存總量達到hbase.regionserver.global.memstore.upperLimit指定值時,將會有多個MemStores flush到文件中,MemStore flush 順序是按照大小降序執行的,直到刷新到MemStore使用內存略小於lowerLimit

相關文章
相關標籤/搜索