日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
硬吃一個P0故障,「在線業(yè)務」應該如何調(diào)優(yōu)HBase參數(shù)?

1.背景

由于種種原因,最近將核心業(yè)務生產(chǎn)使用的HBase遷移到了云上的彈性MapReduce(EMR)集群上,并使用了EMR的HBase組件默認參數(shù)配置。

創(chuàng)新互聯(lián)公司長期為超過千家客戶提供的網(wǎng)站建設(shè)服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為江達企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計,江達網(wǎng)站改版等技術(shù)服務。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

結(jié)果在流量高峰期出現(xiàn)了宿主機故障,掛掉了兩個core節(jié)點(部署了region server和datanode),大量region rit,花了15分鐘才自動恢復,硬生生吃了一個P0故障。

復盤的時候發(fā)現(xiàn),由于云上EMR對hdfs的socket超時參數(shù)默認設(shè)置了900000(15min),導致了region重新上線讀取故障節(jié)點WAL日志的時候足足等待了15分鐘才去重試下個節(jié)點。這樣的自愈時間顯然是不滿足「在線業(yè)務」的需求的,需要將這個超時時間調(diào)整到60000(1min),實現(xiàn)快速自愈的目的。

因此,結(jié)合HBase自身組件特性與 「在線業(yè)務」高可用、低抖動 訴求,全面整理了HBase參數(shù)調(diào)優(yōu)的最佳實踐。

2.先回顧下HBase基礎(chǔ)架構(gòu)

這里只是簡單回顧下整體架構(gòu),方便對照各個組件聊一聊需要優(yōu)化的參數(shù)。

2.1 整體架構(gòu)

從物理結(jié)構(gòu)上,HBase包含了三種類型的server,zookeeper、HMaster、RegionServer,從而形成了一種主從模式的結(jié)構(gòu)。

                     

  • RegionServer主要用來服務讀和寫操作。當用戶通過client訪問數(shù)據(jù)時,client會和HBase RegionServer 進行直接通信。
  • HMaster主要進行RegionServer的管理、DDL(創(chuàng)建、刪除表)操作等。
  • Zookeeper是HDFS(Hadoop Distributed File System)的一部分,主要用來維持整個集群的存活,保障了HA,故障自動轉(zhuǎn)移。
  • 底層的存儲,還是依賴于HDFS的。Hadoop的DataNode存儲了RegionServer所管理的數(shù)據(jù),所有HBase的數(shù)據(jù)都是存在HDFS中的。Hadoop的NameNode維護了所有物理數(shù)據(jù)塊的metadata。

2.2 RegionServer組成

一個RegionServer運行在一個HDFS的DataNode上,并且擁有以下組件:

                    

  • WAL:全稱Write Ahead Log,屬于分布式系統(tǒng)上的文件。主要用來存儲還未被持久化到磁盤上的新數(shù)據(jù)。如果新數(shù)據(jù)還未持久化,節(jié)點發(fā)生宕機,那么就可以用WAL來恢復這些數(shù)據(jù)。
  • BlockCache:是一個讀緩存。它存儲了被高頻訪問的數(shù)據(jù)。當這個緩存滿了后,會清除最近最少訪問的數(shù)據(jù)。
  • MenStore: 是一個寫緩存。它存儲了還未被寫入磁盤的數(shù)據(jù)。它會在寫入磁盤前,對自身數(shù)據(jù)進行排序,從而保證數(shù)據(jù)的順序?qū)懭?。每個region的每個colum family會有一份對應的memstore。
  • HFiles:按照字典序存儲各個row的鍵值。

3、讀優(yōu)化

3.1 優(yōu)化讀/寫內(nèi)存比例

一個RegionServer上有一個BlockCache和N個Memstore,它們的大小之和必須小于HeapSize* 0.8,否則HBase不能啟動,因為仍然要留有一些內(nèi)存保證其它任務的執(zhí)行。

BlockCache作為讀緩存,對于讀的性能比較重要,如果讀比較多,建議內(nèi)存使用1:4的機器,比如:8cpu32g或者16pu64g的機器。

讀多寫少的場景下,可以調(diào)高BlockCache的數(shù)值,降低Memstore的數(shù)值來提高讀場景性能。

核心調(diào)整參數(shù)如下:

- hfile.block.cache.size = 0.5
- hbase.regionserver.global.memstore.size = 0.3

3.2 減少HFile數(shù)量

因為HBase讀取時沒有命中緩存,就需要打開HFile。如果HFile文件越多,IO次數(shù)就越多,讀取的延遲就越高。

因此,HBase通過compaction機制來合并HFile。

但是,對于「在線業(yè)務」來說,白天流量高峰做compact會嚴重影響磁盤IO,造成讀寫毛刺,因此需要對compact限速。

3.3 開啟「短路讀」特性

HBase數(shù)據(jù)是存儲在HDFS,從HDFS讀取數(shù)據(jù)需要經(jīng)過DataNode,開啟Short-Circuit Local Read后,客戶端可以直接讀取本地數(shù)據(jù)。

假設(shè)現(xiàn)有兩個用戶User1和User2,User1擁有訪問HDFS目錄上/appdata/hbase1文件的權(quán)限,而User2用戶沒有該權(quán)限,但是User2用戶又需要訪問這個文件,那么可以借助UNIX中「文件描述符傳遞」的機制,可以讓User1用戶打開文件得到一個文件描述符,然后把文件描述符傳遞給User2用戶,那么User2用戶就可以讀取文件里面的內(nèi)容了,即使User2用戶沒有權(quán)限。

這種關(guān)系映射到HDFS中,可以把DataNode看作User1用戶,客戶端DFSClient看作User2用戶,需要讀取的文件就是DataNode目錄中的/appdata/hbase1文件。實現(xiàn)如下圖所示:

               

核心參數(shù)如下:

- dfs.client.read.shortcircuit = true

3.4 開啟「對沖讀」特性(需要評估磁盤IO)

當我們開啟「短路讀」特性后,優(yōu)先會通過Short-Circuit Local Read功能嘗試本地讀。但是在某些特殊情況下,有可能會出現(xiàn)因為磁盤問題或者網(wǎng)絡問題引起的短時間本地讀取失敗。

為了應對這類問題,HBase實現(xiàn)了「對沖讀」特性Hedged Read。

該機制基本工作原理為:

客戶端發(fā)起一個本地讀,一旦一段時間之后還沒有返回,客戶端將會向其他DataNode發(fā)送相同數(shù)據(jù)的請求。哪一個請求先返回,另一個就會被丟棄。

當然,這個特性顯然會放大磁盤IO的壓力,需要謹慎評估使用。

核心參數(shù)如下:(根據(jù)實際環(huán)境對參數(shù)進行調(diào)整)。

- dfs.client.hedged.read.threadpool.size = 10 //指定有多少線程用于服務hedged reads。如果此值設(shè)置為0(默認),則hedged reads為disabled狀態(tài)
- dfs.client.hedged.read.threshold.millis:默認為500(0.5秒):在spawning 第二個線程前,等待的時間。

4、寫優(yōu)化

4.1 增大MemStore的內(nèi)存

面對「寫多讀少」的場景, 可以考慮調(diào)高MemStore 的內(nèi)存占比,降低BlockCache的內(nèi)存占比,跟讀優(yōu)化3.1的思路正好相反。

具體可以根據(jù)讀寫比例來評估。

4.2 適當增加HFile產(chǎn)生

本條與3.2并不沖突,需要權(quán)衡。

數(shù)據(jù)寫入過程中,MemStore在滿足一定條件時會flush刷寫到磁盤,生成一個HFile文件。當一個Store下的HFile文件數(shù)量大于某個閾值時,就會引起寫入或更新阻塞。

RS日志中會有類似 “has too many store files...” 的信息。當出現(xiàn)這種情況時,需要等待Compaction合并以減少HFile數(shù)量,這里主要是Minor Compaction即小合并。

所以我們盡量調(diào)大這個閾值,減少compaction。

核心參數(shù):

- hbase.hstore.blockingStoreFiles = 100

如果寫很快,很容易帶來大量的HFile,因為此時HFile合并的速度還沒有寫入的速度快。

需要在業(yè)務低峰期做major compaction,充分利用系統(tǒng)資源。如果HFile降低不下來,則需要添加節(jié)點。

4.3 適當增大Memstore阻塞倍數(shù)

當MemStore大小達到刷寫閾值(hbase.hregion.memstore.flush.size,默認128M)時,就會flush刷寫到磁盤,這個操作基本沒有阻塞。但當一個Region的所有MemStore大小達到一個阻塞倍數(shù)(hbase.hregion.memstore.block.multiplier,默認值為4,即4倍的刷寫閾值 默認4*128=512M)時,就會阻塞該Region所有的更新請求,并強制flush。客戶端可能會拋出RegionTooBusyException異常。

為了盡量避免寫入阻塞,可以適當調(diào)整這兩個參數(shù)。

核心參數(shù)包括:

- hbase.hregion.memstore.flush.size = 128
- hbase.hregion.memstore.block.multiplier = 4

5.IO優(yōu)化

HBase利用compaction機制,通過大量的讀延遲毛刺和一定的寫阻塞,來換取整體上的讀取延遲的平穩(wěn)。

為了綜合權(quán)衡 性能 與 穩(wěn)定性,需要對compation做限速處理。

核心調(diào)整參數(shù)如下:

- hbase.offpeak.end.hour = 6 //允許不限速compact的結(jié)束時間
- hbase.offpeak.start.hour = 22 //允許不限速compact的開始時間
- hbase.hstore.compaction.throughput.higher.bound = 15728640 //限速compact最大為15M
- hbase.hstore.compaction.throughput.lower.bound = 10485760 //限速compact最小為10M
- hbase.hregion.majorcompactio = 0 //關(guān)閉定時major compaction
- hbase.regionserver.thread.compaction.large = 1 //compation線程
- hbase.regionserver.thread.compaction.small = 1//compaction線程
- hbase.hstore.compaction.max = 3 //一次Minor Compaction最多合并的HFile文件數(shù)

需要注意的是,白天compaction限速,并且關(guān)閉了定時major compaction后,可能會導致HFile合并不足,因此,可以考慮外部控制(如java api)定時在夜間做major compaction來減少HFile數(shù)量。

6.故障恢復優(yōu)化

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

這些場景下一旦RegionServer發(fā)生宕機,HBase都會馬上檢測到這種宕機,并且在檢測到宕機之后會將宕機RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根據(jù)HLog進行丟失數(shù)據(jù)恢復,恢復完成之后就可以對外提供服務,整個過程都是自動完成的,并不需要人工介入?;驹砣缦聢D所示:

              

當datanode異常時,如果讀取超時設(shè)置過大(dfs.client.socket-timeout和dfs.socket.timeout),region無法正常讀取WAL日志,就會導致恢復耗時增加。

核心參數(shù)如下:

- dfs.client.socket-timeout = 60000
- dfs.datanode.socket.write.timeout = 480000
- dfs.socket.timeout = 60000

7.其他優(yōu)化

7.1 split策略

HBase 2.0.0 以上版本采用的 split 策略是 SteppingSplitPolicy。

SteppingSplitPolicy 在初期 region 數(shù)量較少的時候,split 的閾值較低,會比較頻繁地觸發(fā) split。

我們已經(jīng)給表做了預分區(qū),所以可以將split策略設(shè)置為固定大小(大小由參數(shù)hbase.hregion.max.filesize 決定)。

核心參數(shù):

- hbase.regionserver.region.split.policy = org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy

7.2 開啟rsgroup

rsgroup對于擴縮容等運維操作有很大的幫助,可以很好的控制region移動造成的影響。move_servers_rsgroup 命令的 for 循環(huán)里會將 region 逐個移動。

- hbase.coprocessor.master.classes = org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpointhbase.master.loadbalancer.class = org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer

另外,為了避免rs故障導致的meta表的「重試風暴」,region漂移失敗(異常opening狀態(tài)),可以給meta表設(shè)置獨立的rsgroup,與業(yè)務rsgroup進行隔離。同時,增大meta表的handler數(shù)量。

- hbase.regionserver.metahandler.count = 400 //建議根據(jù)客戶端數(shù)量進行評估設(shè)置

8.小結(jié)

本文從HBase「基礎(chǔ)架構(gòu)」出發(fā),梳理各個組件、讀寫流程的參數(shù)調(diào)優(yōu),期望能滿足「在線業(yè)務」的高可用、低抖動的需求。


當前文章:硬吃一個P0故障,「在線業(yè)務」應該如何調(diào)優(yōu)HBase參數(shù)?
本文鏈接:http://www.5511xx.com/article/dhsoisc.html