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