hbase scan超时设置_深入浅出HBase系列(二)
今天來講講HBase讀的過程:
1、HBase讀過程詳解
2.1影響HBase讀取命令的參數(shù)
HBase讀包含兩種命令:get ,基于確切的RowKey去獲取一行數(shù)據(jù),通常被稱之為隨機(jī)點(diǎn)查;scan,指定一個(gè)RowKey的范圍區(qū)間,獲取該區(qū)間的所有記錄,當(dāng)區(qū)間未明確指定時(shí),scan退化為全表掃描;
圖2.1 client端scan的示意圖
Client每一次往RegionServer發(fā)送scan請求,都會(huì)批量拿回一批數(shù)據(jù)(由Caching決定每一次拿回的Results數(shù)量),然后放到本次的Result Cache中:應(yīng)用每一次讀取數(shù)據(jù)都是從本地的Result Cache中獲取的,如果Result Cache中的數(shù)據(jù)讀完了,則Client會(huì)再次往RegionServer發(fā)送scan請求獲取更多的數(shù)據(jù)。此處有8個(gè)編程參數(shù)會(huì)影響讀取過程:
①Caching: 設(shè)置一次RPC請求批量讀取Results的數(shù)量;scan.setCaching(100);
②Batch: 設(shè)置每一個(gè)Result中的列的數(shù)量;scan.setBatch(10);
③Limit: 限制一次Scan操作所獲取的行的數(shù)量;scan.setLimit(1000);
④Cache Block: RegionServer側(cè)是否要緩存本次Scan所涉及的HFileBlocks;scan.setCacheBlocks(true);
⑤Raw Scan: 是否可以讀取到刪除標(biāo)識(shí)以及被刪除但尚未被清理的數(shù)據(jù);scan.setRaw(true);
⑥MaxResultSize: 從內(nèi)存占用量的維度限制一次Scan的返回結(jié)果集;scan.setMaxResultSize(5*1024*1024);
⑦Reversed Scan: 反向掃描,普通的Scan操作是按照字典順序從小到大的順序讀取的,而Reversed Scan則恰好相反:scan.setReversed(true);
⑧帶Filter的Scan,Filter可以在Scan的結(jié)果集基礎(chǔ)之上,對返回的記錄設(shè)置更多條件值,這些條件可以與RowKey有關(guān),可以與列名有關(guān),也可以與列值有關(guān),還可以將多個(gè)Filter條件組合在一起等;scan.setFilter(filter);
2.2讀取過程詳述
Client發(fā)送讀取請求后,整個(gè)讀取過程敘述如下:
2.2.1 定位Region
定位請求關(guān)聯(lián)的Region的時(shí)候,對于get定位與rowkey參數(shù)關(guān)聯(lián)的region;對于scan先定位與starRow參數(shù)關(guān)聯(lián)的region;過程詳述如下:
2.2.1.1找到-ROOT-表
要根據(jù)查詢參數(shù)的rowkey找到到對應(yīng)的結(jié)果數(shù)據(jù),需要先找-ROOT-表,-ROOT-表中存放了.META.表是由哪個(gè)regionServer管理的信息,而.META.表保存了Hbase中所有數(shù)據(jù)表的region的位置信息。要找-ROOT-表,則需要先與zookeeper通信,找到管理-ROOT-表的RegionServer的地址,這個(gè)地址存在zookeeper中,默認(rèn)值是:/hbase/root-region-server;找到管理-ROOT-表的Regionserver的地址后,就可以與這個(gè)RegionServer通信,獲取到-ROOT-表的內(nèi)容,-ROOT-表的內(nèi)容如下:
表2.2.1.1.1 -ROOT-表結(jié)構(gòu)可以看到,-ROOT-表的內(nèi)容包含了各個(gè)RegionServer上都管理了哪些.META.表的信息,這些.META.表中又有哪些Region,相關(guān)的rowkey在怎樣的范圍等信息,因此通過rowkey可以在-ROOT-表中找到具體和rowkey相關(guān)的.META.表所在的regionServer地址信息;因.META.表也是有region的,也會(huì)不斷進(jìn)行分裂的,所以需要記錄timestamp,查找的時(shí)候要找最新timestamp對應(yīng)的記錄;
每個(gè)regionServer啟動(dòng)的時(shí)候,都會(huì)分配一個(gè)startcode,和host,port,startcode統(tǒng)一構(gòu)成一個(gè)regionserver的唯一標(biāo)志,所以一臺(tái)機(jī)器重啟前后其實(shí)是兩個(gè)不同rs。
注意:-ROOT-表只有一個(gè)region,且永遠(yuǎn)不會(huì)分裂;
圖2.2.1.1.1 -ROOT-表示例2.2.1.2找到.META.表
通過-ROOT-表找到某個(gè)regionServer上的.META.表后,可以通過.META.表來找到rowkey相關(guān)的Region,我們來看看.META.表的結(jié)構(gòu):
表2.2.1.2.1.META.表結(jié)構(gòu)可以看到,.META.表結(jié)構(gòu)和-ROOT-表結(jié)構(gòu)完全一致,只是rowkey構(gòu)成不同;因此通過rowkey可以找到管理region的RegionServer的地址;
圖2.2.1.2.1.META.表示例注意:由于一個(gè)HBase數(shù)據(jù)庫中會(huì)存在很多表,也會(huì)存在很多region,因此.META表會(huì)非常大,而.META.表只是HBase中的一張普通表,因此本身也需要分裂成多個(gè)region,所以.META.表會(huì)存在與多個(gè)Regionserver上,這也是為什么需要設(shè)置-ROOT-表的原因。.META.表一般都全部加載在內(nèi)存中;
當(dāng)然 HBase 客戶端會(huì)緩存這些尋址的數(shù)據(jù),只有在數(shù)據(jù)失效或無相關(guān)數(shù)據(jù)的時(shí)候才會(huì)按照上面的流程定位到對應(yīng)的 RegionServer。
從.META.表中得到管理region的Regionserver后,連接對應(yīng)的RegionServer,發(fā)送讀取Region的請求;
2.2.1.3找到對應(yīng)的Region后的過程
向regionserver發(fā)送讀取請求,之后的過程如下圖:
2.2.1.3.1 找到Region后RegionServer讀取掃描數(shù)據(jù)的過程這里有三種情況:
①對于新寫入的Cell數(shù)據(jù),它可能會(huì)存在于MemStore中;
②對于已經(jīng)Flush到HFile中的Cell數(shù)據(jù),它會(huì)存在于某個(gè)或某些StoreFile(HFile)中;
③對于剛讀取過的Cell數(shù)據(jù),它可能存在于BlockCache中;
所以對于任意數(shù)據(jù),Cel上數(shù)據(jù)可能存儲(chǔ)在三個(gè)地方,在讀取的時(shí)候需要掃瞄這三個(gè)地方,然后將結(jié)果合并即可(Merge Read),RegionServer中掃描的順序依次是:BlockCache、MemStore、StoreFile(HFile)。
其中StoreFile的掃描先會(huì)使用Bloom Filter過濾那些不可能符合條件的HFile,然后讀取HFile中的Trailer,將Data Block Index讀入內(nèi)存,這樣,檢索某個(gè)rowkey時(shí),不需要掃描整個(gè)HFile,而只需從內(nèi)存中找到rowkey所在的data block,通過一次磁盤io將整個(gè) data block讀取到內(nèi)存中,再找到需要的rowkey。使用Block Index快速定位到數(shù)據(jù)后,將其加載到BlockCache中,然后從BlockCache中讀取數(shù)據(jù)。
這里要注意,一個(gè)HStore可能存在多個(gè)StoreFile(HFile),此時(shí)需要掃瞄多個(gè)HFile,如果HFile過多,則會(huì)引起性能問題,因此需要對HFile進(jìn)行Compation。
如果覺得有用,記得關(guān)注點(diǎn)贊哦,:)
總結(jié)
以上是生活随笔為你收集整理的hbase scan超时设置_深入浅出HBase系列(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npoi生成的表格数字左上角_如何用op
- 下一篇: hbase 客户端_全网最细致的 HBa