這篇文章主要介紹HBase 0.94中的Split策略有什么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為林口企業(yè)提供專業(yè)的成都網(wǎng)站制作、做網(wǎng)站,林口網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
HBase 0.94之前版本中,split使用的是ConstantSizeRegionSplitPolicy。當(dāng)region中文件大小超過配置中所指定大小時(shí),會(huì)進(jìn)行切分。
而在0.94版本之后,默認(rèn)split策略修改為了IncreasingToUpperBoundRegionSplitPolicy。該策略使用了另一種方法來計(jì)算是否應(yīng)當(dāng)切割,導(dǎo)致原先的參數(shù)失效。
該方法中的分配策略,是根據(jù)table中region的個(gè)數(shù)平方,乘以memstore的大小。得出應(yīng)當(dāng)切分的大小。
假設(shè)memstore size配置為128M,則在memstore第一次刷入HFile數(shù)據(jù)時(shí),進(jìn)行第一次split,1 * 1 * 128M = 128M。
當(dāng)region數(shù)達(dá)到2個(gè)時(shí),2 * 2 * 128M = 512M。
當(dāng)region數(shù)達(dá)到3個(gè)時(shí),3 * 3 * 128M = 1152M。
依此類推。
當(dāng)region個(gè)數(shù)到達(dá)30個(gè)時(shí),30 * 30 * 128 = 107648M = 105.1G。即在此時(shí),region的切分大小已經(jīng)超過了我們原先在ConstantSizeRegionSplitPolicy策略中設(shè)置的100G大小。
對這種策略進(jìn)行簡單的分析,可以看到,在數(shù)據(jù)寫入初期,這種策略可以快速的對現(xiàn)有region進(jìn)行split,使得在一開始就可以將熱點(diǎn)region切分到多個(gè)server上。同時(shí)由于region size較小,也可以避免split操作對寫入的阻塞。
而在后期,當(dāng)region數(shù)量逐漸增多,單個(gè)region size逐漸增大時(shí),split頻率會(huì)急速減少,避免在region過大時(shí)頻繁split的情況。
這種策略一方面在數(shù)據(jù)量增大的情況下減少了region的切分次數(shù),達(dá)到了我們期望的盡量減少split的需求,避免對寫入造成影響。同時(shí)在初期的快速切分,在基本不影響寫入的同時(shí),也減少了我們原先需要手動(dòng)操作split的問題。可以認(rèn)為,這種策略是符合我們需求的。當(dāng)然,還需要進(jìn)一步的測試來進(jìn)行驗(yàn)證。
源碼如下:
/**
* @return Region max size or count of regions squared * flushsize, which ever is
* smaller; guard against there being zero regions on this server.
*/
long getSizeToCheck(final int tableRegionsCount) {
return tableRegionsCount == 0? getDesiredMaxFileSize():
Math.min(getDesiredMaxFileSize(),
this.flushSize * (tableRegionsCount * tableRegionsCount));
}
@Override
protected boolean shouldSplit() {
if (region.shouldForceSplit()) return true;
boolean foundABigStore = false;
// Get count of regions that have the same common table as this.region
int tableRegionsCount = getCountOfCommonTableRegions();
// Get size to check
long sizeToCheck = getSizeToCheck(tableRegionsCount);
for (Store store : region.getStores().values()) {
// If any of the stores is unable to split (eg they contain reference files)
// then don't split
if ((!store.canSplit())) {
return false;
}
// Mark if any store is big enough
long size = store.getSize();
if (size > sizeToCheck) {
LOG.debug("ShouldSplit because " + store.getColumnFamilyName() +
" size=" + size + ", sizeToCheck=" + sizeToCheck +
", regionsWithCommonTable=" + tableRegionsCount);
foundABigStore = true;
break;
}
}
return foundABigStore;
}
以上是“HBase 0.94中的Split策略有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!