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