W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如果您遇到性能問(wèn)題,郵件列表可以提供幫助。例如,這里有一個(gè)關(guān)于解決讀取時(shí)間問(wèn)題的一個(gè)很好的通用線程:HBase隨機(jī)讀取延遲> 100ms
例如,如果將HBase用作MapReduce作業(yè)的輸入源,請(qǐng)確保MapReduce作業(yè)的輸入掃描實(shí)例已經(jīng)將setCaching設(shè)置為大于默認(rèn)值(即1)的值。使用默認(rèn)值意味著map-task將為處理的每個(gè)記錄回調(diào)region-server。例如,將此值設(shè)置為500將一次傳輸500行到要處理的客戶端。緩存值很大是有成本/收益的,因?yàn)榭蛻舳撕蚏egionServer的內(nèi)存成本更高,因此更大并不總是更好。
MapReduce作業(yè)中的掃描設(shè)置值得特別注意。如果在客戶端返回到RegionServer以獲取下一組數(shù)據(jù)之前處理一批記錄需要更長(zhǎng)時(shí)間,則可能會(huì)在Map任務(wù)中導(dǎo)致超時(shí)(例如,UnknownScannerException)。發(fā)生此問(wèn)題的原因是每行發(fā)生重要的處理。如果快速處理行,請(qǐng)將緩存設(shè)置得更高。如果您更慢地處理行(例如,每行進(jìn)行大量轉(zhuǎn)換,寫(xiě)入),則將緩存設(shè)置為更低。
超時(shí)也可能發(fā)生在非MapReduce用例中(即,執(zhí)行掃描的單線程HBase客戶端),但通常在MapReduce作業(yè)中執(zhí)行的處理往往會(huì)加劇此問(wèn)題。
每當(dāng)使用掃描處理大量行(特別是用作MapReduce源)時(shí),請(qǐng)注意選擇了哪些屬性。如果scan.addFamily調(diào)用,則指定ColumnFamily中的所有屬性將返回給客戶端。如果只處理少量可用屬性,則只應(yīng)在輸入掃描中指定那些屬性,因?yàn)閷傩赃^(guò)度選擇對(duì)大型數(shù)據(jù)集而言是一個(gè)非常重要的性能損失。
當(dāng)使用scan.addColumn明確選擇列時(shí),HBase將調(diào)度查找操作以在所選列之間進(jìn)行查找。當(dāng)行包含少量列且每列只有幾個(gè)版本時(shí),這可能是效率低下。 如果不查找至少超過(guò)5-10個(gè)列/版本或512-1024字節(jié),則查找操作通常會(huì)比較慢。
為了機(jī)會(huì)性地向前看幾列/版本以查看在調(diào)度查找操作之前是否可以找到下一列/版本,可以在Scan對(duì)象上設(shè)置新屬性Scan.HINT_LOOKAHEAD。以下代碼指示RegionServer在調(diào)度查找之前嘗試以下兩次迭代:
Scan scan = new Scan();
scan.addColumn(...);
scan.setAttribute(Scan.HINT_LOOKAHEAD, Bytes.toBytes(2));
table.getScanner(scan);
這不僅僅是提高性能,而是避免性能問(wèn)題。如果忘記關(guān)閉ResultScanners,可能會(huì)導(dǎo)致RegionServers出現(xiàn)問(wèn)題。始終將ResultScanner處理包含在try/catch塊中。
Scan scan = new Scan();
// set attrs...
ResultScanner rs = table.getScanner(scan);
try {
for (Result r = rs.next(); r != null; r = rs.next()) {
// process result...
} finally {
rs.close(); // always close the ResultScanner!
}
table.close();
可以通過(guò)該setCacheBlocks方法將掃描實(shí)例設(shè)置為使用RegionServer中的塊緩存。對(duì)于輸入掃描到MapReduce作業(yè),這應(yīng)該是false。對(duì)于頻繁訪問(wèn)的行,建議使用塊緩存。
通過(guò)在堆外移動(dòng)塊緩存來(lái)緩存更多數(shù)據(jù)。請(qǐng)參閱堆外塊緩存。
執(zhí)行只需要行鍵的表掃描(沒(méi)有族,限定符,值或時(shí)間戳)時(shí),請(qǐng)使用setFilter向掃描儀添加帶有MUST_PASS_ALL運(yùn)算符的FilterList。篩選器列表應(yīng)包括FirstKeyOnlyFilter和KeyOnlyFilter。使用此篩選器組合將導(dǎo)致最壞的情況,即RegionServer從磁盤(pán)讀取單個(gè)值,并為單個(gè)行將最小的網(wǎng)絡(luò)流量發(fā)送到客戶端。
執(zhí)行大量并發(fā)讀取時(shí),監(jiān)視目標(biāo)表的數(shù)據(jù)傳播。如果目標(biāo)表具有的區(qū)域太少,則可能從太少的節(jié)點(diǎn)提供讀取。
請(qǐng)參閱表創(chuàng)建:預(yù)創(chuàng)建區(qū)域以及HBase配置
啟用Bloom過(guò)濾器可以節(jié)省您的磁盤(pán)空間,并有助于改善讀取延遲。
Bloom過(guò)濾器是在HBase-1200 Add bloomfilters中開(kāi)發(fā)的。這里描述的Bloom過(guò)濾器實(shí)際上是HBase中的第二版。在0.19.x版本中,HBase根據(jù)歐盟委員會(huì)一個(gè)實(shí)驗(yàn)室項(xiàng)目034819所做的工作提供了動(dòng)態(tài)bloom選項(xiàng)。HBase bloom工作的核心后來(lái)被引入Hadoop以實(shí)現(xiàn)org.apache.hadoop.io.BloomMapFile。
Bloom過(guò)濾器向StoreFile常規(guī)FileInfo數(shù)據(jù)結(jié)構(gòu)添加項(xiàng),然后向StoreFile元數(shù)據(jù)部分添加兩個(gè)額外項(xiàng)。
BloomFilter在StoreFile``FileInfo數(shù)據(jù)結(jié)構(gòu)中:
FileInfo有一個(gè)BLOOM_FILTER_TYPE條目,它設(shè)置為NONE,ROW或ROWCOL.
StoreFile元數(shù)據(jù)中的BloomFilter條目:
BLOOM_FILTER_META保持Bloom Size,使用Hash函數(shù)等。它的大小很小,并且在StoreFile.Reader加載時(shí)緩存。
BLOOM_FILTER_DATA是實(shí)際的bloomfilter數(shù)據(jù),按需獲得。如果已啟用(默認(rèn)情況下已啟用),存儲(chǔ)在LRU緩存中。
io.storefile.bloom.enabled 全局關(guān)閉開(kāi)關(guān):
io.storefile.bloom.enabled在Configuration用作關(guān)閉l開(kāi)關(guān),防止出現(xiàn)問(wèn)題;Default= true。
io.storefile.bloom.error.rate:
io.storefile.bloom.error.rate=平均誤報(bào)率。Default= 1%。
io.storefile.bloom.max.fold=保證最低折疊率,大多數(shù)人都不應(yīng)該管它。Default= 7,或者至少可以折疊到原始大小的1/128。=
Hedged讀取是HDFS的一項(xiàng)功能,在Hadoop 2.4.0中引入了HDFS-5776。通常,為每個(gè)讀取請(qǐng)求生成一個(gè)線程。但是,如果啟用了Hedged讀取,則客戶端會(huì)等待一段可配置的時(shí)間,如果讀取未返回,則客戶端會(huì)針對(duì)相同數(shù)據(jù)的不同塊副本生成第二個(gè)讀取請(qǐng)求。使用先返回的一個(gè),并丟棄另一個(gè)讀取請(qǐng)求。
在啟用Hedged讀取的情況下運(yùn)行時(shí)要記住的其他問(wèn)題包括:
由于HBase RegionServer是HDFS客戶端,因此您可以在HBase中啟用Hedged讀取,方法是將以下屬性添加到R??egionServer的hbase-site.xml并調(diào)整值以適合您的環(huán)境。
Hedged讀取的配置
Hedged讀取配置示例:
<property>
<name>dfs.client.hedged.read.threadpool.size</name>
<value>20</value> <!-- 20 threads -->
</property>
<property>
<name>dfs.client.hedged.read.threshold.millis</name>
<value>10</value> <!-- 10 milliseconds -->
</property>
使用以下指標(biāo)調(diào)整群集上Hedged讀取的設(shè)置。
Hedged讀取的指標(biāo):
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: