大家好,我是不溫蔔火,是一名計算機學院大資料專業大二的學生,昵稱來源于成語—<code>不溫不火</code>,本意是<code>希望自己性情溫和</code>。作為一名網際網路行業的小白,部落客寫部落格一方面是為了記錄自己的學習過程,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新。但由于水準有限,部落格中難免會有一些錯誤出現,有纰漏之處懇請各位大佬不吝賜教!暫時隻有csdn這一個平台,
此篇為大家帶來的是HBase優化。
1. HBase HA(高可用)
2. 預分區
3. RowKey設計
4. 記憶體優化
5. 基礎優化

原文位址:javascript:void(0)
在HBase中Hmaster負責監控RegionServer的生命周期,均衡RegionServer的負載,如果Hmaster挂掉了,那麼整個HBase叢集将陷入不健康的狀态,并且此時的工作狀态并不會維持太久。是以HBase支援對Hmaster的高可用配置。
1. 關閉HBase叢集(如果沒有開啟則跳過此步)
2. 在conf目錄下建立backup-masters檔案(要整個叢集都有)
3. 将整個conf目錄scp到其他節點
4. 啟動測試
http://hadooo002:16010
每一個region維護着startRow與endRowKey,如果加入的資料符合某個region維護的rowKey範圍,則該資料交給這個region維護。那麼依照這個原則,我們可以将資料所要投放的分區提前大緻的規劃好,以提高HBase性能。
1. 手動設定預分區
檢視分區情況(web)
2. 生成16進制序列預分區
放入一條資料
3. 按照檔案中設定的規則預分區
① 建立splits.txt檔案内容如下:
② 然後執行
4. 使用JavaAPI建立預分區
一條資料的唯一辨別就是rowkey,那麼這條資料存儲于哪個分區,取決于rowkey處于哪個一個預分區的區間内,設計rowkey的主要目的 ,就是讓資料均勻的分布于所有的region中,在一定程度上防止資料傾斜。接下來我們就談一談rowkey常用的設計方案。
1. 生成随機數、hash、散列值
2. 字元串反轉
3. 字元串拼接
HBase操作過程中需要大量的記憶體開銷,畢竟Table是可以緩存在記憶體中的,一般會配置設定整個可用記憶體的70%給HBase的Java堆。但是不建議配置設定非常大的堆記憶體,因為GC過程持續太久會導緻RegionServer處于長期不可用狀态,一般16~48G記憶體就可以了,如果因為架構占用記憶體過高導緻系統記憶體不足,架構一樣會被系統服務拖死。
1. 允許在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.hregion.max.filesize 解釋:預設值10737418240(10GB),如果需要運作HBase的MR任務,可以減小此值,因為一個region對應一個map任務,如果單個region過大,會導緻map任務執行時間過長。該值的意思就是,如果HFile的大小達到這個數值,則這個region會被切分為兩個Hfile。
7. 優化hbase用戶端緩存
屬性:hbase.client.write.buffer 解釋:用于指定HBase用戶端緩存,增大該值可以減少RPC調用次數,但是會消耗更多記憶體,反之則反之。一般我們需要設定一定的緩存大小,以達到減少RPC次數的目的。
8. 指定scan.next掃描HBase所擷取的行數
屬性:hbase.client.scanner.caching 解釋:用于指定scan.next方法擷取的預設行數,值越大,消耗記憶體越大。
9. flush、compact、split機制
當MemStore達到門檻值,将Memstore中的資料Flush進Storefile;compact機制則是把flush出來的小檔案合并成大的Storefile檔案。split則是當Region達到門檻值,會把過大的Region一分為二。
涉及屬性:
即:128M就是Memstore的預設門檻值
即:這個參數的作用是當單個HRegion内所有的Memstore大小總和超過指定值時,flush該HRegion的所有memstore。RegionServer的flush是通過将請求添加一個隊列,模拟生産消費模型來異步處理的。那這裡就有一個問題,當隊列來不及消費,産生大量積壓請求時,可能會導緻記憶體陡增,最壞的情況是觸發OOM。
即:當MemStore使用記憶體總量達到hbase.regionserver.global.memstore.upperLimit指定值時,将會有多個MemStores flush到檔案中,MemStore flush 順序是按照大小降序執行的,直到重新整理到MemStore使用記憶體略小于lowerLimit
本次的分享就到這裡了,
好書不厭讀百回,熟讀課思子自知。而我想要成為全場最靓的仔,就必須堅持通過學習來擷取更多知識,用知識改變命運,用部落格見證成長,用行動證明我在努力。 如果我的部落格對你有幫助、如果你喜歡我的部落格内容,聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我部落格看看。 碼字不易,大家的支援就是我堅持下去的動力。