日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于hbase的read操作的深入研究 region到storefile过程

發(fā)布時(shí)間:2025/3/13 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于hbase的read操作的深入研究 region到storefile过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
關(guān)于hbase的read操作的深入研究 region到storefile過程

這里面說的read既包括get,也包括scan,實(shí)際底層來看這兩個(gè)操作也是一樣的。
我們將要討論的是,當(dāng)我們從一張表讀取數(shù)據(jù)的時(shí)候hbase到底是怎么處理的。
分二種情況來看,第一種就是表剛創(chuàng)建,所有put的數(shù)據(jù)還在memstore中,并沒有刷新到hdfs上;第二種情況是,該store已經(jīng)進(jìn)行多次的flush操作,產(chǎn)生了多個(gè)storefile了。
在具體說明兩種情況前,先考慮下表的region的問題,如果表只有一個(gè)region,那么沒有說的,肯定是要掃描這個(gè)唯一的region。假設(shè)該表有多個(gè)region,此時(shí).META.表就派上用場了,hbase會(huì)首先根據(jù)你要掃描的數(shù)據(jù)的rowkey來判斷到底該數(shù)據(jù)放在哪個(gè)region上,該region所在服務(wù)器地址,然后把數(shù)據(jù)讀取的請(qǐng)求發(fā)送給該region server。好了,實(shí)際對(duì)數(shù)據(jù)訪問的任務(wù)都會(huì)放在region server上執(zhí)行,為了簡單起見,接下來的討論都是在單臺(tái)region server上對(duì)單個(gè)region的操作。
首先來看第一種情況,表剛創(chuàng)建,所有put的數(shù)據(jù)還在memstore中,并沒有刷新到hdfs上。這個(gè)時(shí)候數(shù)據(jù)是在memstore中,并沒有storefile產(chǎn)生,理所當(dāng)然,hbase要查找memstore來獲得相應(yīng)的數(shù)據(jù)。對(duì)于memstore或者storefile來說,內(nèi)存中都有關(guān)于rowkey的索引的,所以對(duì)于通過rowkey的查詢速度是非常快速的。通過查詢?cè)撍饕椭朗欠翊嬖谛枰榭吹臄?shù)據(jù),已經(jīng)該數(shù)據(jù)在memstore中的位置。通過索引提供的信息就很容易找得到所需要的數(shù)據(jù)。這種情況很簡單。
在來看第二種情況,該store已經(jīng)進(jìn)行多次的flush操作,產(chǎn)生了多個(gè)storefile了。那么數(shù)據(jù)應(yīng)該從哪里查呢?所有的storefile?別忘記還有memstore。此時(shí)memstore中可能還會(huì)有沒來得及flush的數(shù)據(jù)呢。如果此時(shí)該region還有很多的文件,是不是所有的文件都需要查找呢?hbase在查找先會(huì)根據(jù)時(shí)間戳或者查詢列的信息來進(jìn)行過濾,過濾掉那些肯定不含有所需數(shù)據(jù)的storefile或者memstore,盡量把我們的查詢目標(biāo)范圍縮小。
盡管縮小了,但仍可能會(huì)有多個(gè)文件需要掃描的。storefile的內(nèi)部有三維有序的,但是各個(gè)storefile之間并不是有序的。比如,storefile1中可能有rowkey為100到110的記錄,而storefile2可能有rowkey為105到115的數(shù)據(jù),storefile的rowkey的范圍很有可能有交叉。所以查詢數(shù)據(jù)的過程也不可能是對(duì)storefile的順序查找。
hbase會(huì)首先查看每個(gè)storefile的最小的rowkey,然后按照從小到大的順序進(jìn)行排序,結(jié)果放到一個(gè)隊(duì)列中,排序的算法就是按照hbase的三維順序,按照rowkey,column,ts進(jìn)行排序,rowkey和column是升序,而ts是降序。
實(shí)際上并不是所有滿足時(shí)間戳和列過濾的文件都會(huì)加到這個(gè)隊(duì)列中,hbase會(huì)首先對(duì)各個(gè)storefile中的數(shù)據(jù)進(jìn)行探測,只會(huì)掃描掃描那些存在比當(dāng)前查詢的rowkey大的記錄的storefile。舉例來說,我當(dāng)前要查找的rowkey為108,storefile1中rowkey范圍為100~104,storefile2中rowkey的范圍為105~110,那么對(duì)于storefile1最大的rowkey為104,小于105,所以不存在比所查rowkey105大的記錄,storefile并不會(huì)被加到該隊(duì)列中。根據(jù)相同的規(guī)則,storefile2則會(huì)被添加到該隊(duì)列中。
隊(duì)列有了,下面開始查詢數(shù)據(jù),首先通過poll取出隊(duì)列的頭storefile,會(huì)從storefile讀取一條記錄返回;接下來呢,該storefile的下條記錄并不一定是查詢結(jié)果的下一條記錄,因?yàn)殛?duì)列的比較順序是比較的每個(gè)storefile的第一條符合要求的rowkey。所以,hbase會(huì)繼續(xù)從隊(duì)列中剩下的storefile取第一條記錄,把該記錄與頭storefile的第二條記錄做比較,如果前者大,那么返回頭storefile的第二條記錄;如果后者大,則會(huì)把頭storefile放回隊(duì)列重新排序,在重新取隊(duì)列的頭storefile。然后重復(fù)上面的整個(gè)過程。這個(gè)過程比較煩,語言描述不清楚,代碼會(huì)更加清晰。
這段代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public KeyValue next()??throws IOException {
??if(this.current == null) {
? ? return null;
??}
??KeyValue kvReturn = this.current.next();
??KeyValue kvNext = this.current.peek();
??if (kvNext == null) {
? ? this.current.close();
? ? this.current = this.heap.poll();
??} else {
? ? KeyValueScanner topScanner = this.heap.peek();
? ? if (topScanner == null ||
? ?? ???this.comparator.compare(kvNext, topScanner.peek()) >= 0) {
? ?? ?this.heap.add(this.current);
? ?? ?this.current = this.heap.poll();
? ? }
??}
??return kvReturn;
}



以上的代碼在KeyValueHeap.java類中。
舉個(gè)例子來說明:表sunwg01,有兩個(gè)storefile,storefile1中包括rowkey100,rowkey110;storefile2中包括rowkey104,rowkey108。我現(xiàn)在執(zhí)行scan ‘sunwg01′掃描表sunwg01中的所有的記錄。
根據(jù)前面提到的排序規(guī)則,隊(duì)列中會(huì)有2個(gè)元素,按順序分別為storefile1,storefile2。
1,取出storefile1中的第一條記錄rowkey100,并返回該結(jié)果
2,取出storefile1中的下一條記錄rowkey110,同時(shí)取出隊(duì)列剩余storefile的第一條記錄rowkey104,經(jīng)過比較rowkey110大于rowkey104,則將storefile1放回隊(duì)列中
3,因?yàn)殛?duì)列是有序的隊(duì)列,會(huì)重新對(duì)storefile進(jìn)行排序,因?yàn)榇藭r(shí)storefile1的最小rowkey為110,而storefile2的最小rowkey為104,所以排序的結(jié)果為storefile2,storefile1
4,重復(fù)上面的過程,直到查不到記錄為止。
最后查到的結(jié)果為:rowkey100,rowkey104,rowkey108,rowkey110。
順便說下block cache的事情,當(dāng)從storefile中讀數(shù)據(jù)的時(shí)候會(huì)首先查看block cache中是否有該數(shù)據(jù),如果有則直接查block cache,就沒必要查詢hdfs;如果沒有該數(shù)據(jù),那么就只能去查hdfs了。這也是為了block cache的命中率對(duì)性能有很大影響的原因。
上面描述了從hbase中read的基本的過程,還有些細(xì)節(jié)沒有具體說,但是大概過程應(yīng)該是都說到了。

posted on 2014-09-20 21:57 zlingh 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/zlingh/p/3983854.html

總結(jié)

以上是生活随笔為你收集整理的关于hbase的read操作的深入研究 region到storefile过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。