Hbase storefile合併排序

使用場景

      對數據進行合併排序的使用場景很對,不僅是Hbase裏有用到,mapreduce的合併也有用到,也許你的業務代碼裏也須要對數據進行排序。Hbase裏storefile的合併排序仍是比較巧妙的。若是讓你將有序的小文件合併成有序的大文件,你會怎麼作?下面看看Hbase是怎麼作的。但願裏面的合併排序方法能對你有所幫助,有錯誤的地方歡迎拍磚。

原理分析

先回顧下歸併排序算法:

  •  Hbase裏將多個小的有序的storefile合併成一個大的有序的storefile的過程跟歸併排序差很少。可是不知道爲何歸併排序算法就分出兩個小有序集合而不是多個有序集合。Hbase就是多個小的有序集合合併成大的有序集合。
  • 下面看看歸併排序的思想。將兩個有序的小集合合併成一個有序的大集合:好比將集合{1,3,5,7,9}和{2,4,6,8,10}合併成一個大集合。
  • 首先你們都知道兩個有序集合中最小的兩個元素分別是1和2,再從這兩個元素中比較誰更小,那麼更小的就是這兩個集合中最小的元素。好比這裏的1和2中1更小,那麼1就是這兩個集合中最小的元素。下一步把1從集合中取出來放到合併後的集合中{1}。
  • 而後在剩下的集合中分別找出兩個集合中的最小元素是3和2,再比較兩個最小元素誰更小。結果是2比3小,那麼就取出2追加到合併後的集合中{1,2}。
  • 而後再重複上述動做,每次都取出兩個集合中最小元素追加到合併後的集合中,最後獲得的集合就是有序的。組後就生成集合{1,2,3,4,5,6,7,8,9,10}。

再看看Hbase是怎麼對storefile進行合併排序的:

  • Hbase里正常狀況下每一次將內存memstore的數據刷寫到磁盤都會生成一個storefile,長此以往family下面的storefile會變的不少,因此須要合併一下,通常默認的配置就是storefile數量達到3個時就會進行合併。
  • 因爲內存裏memstore是在數據插入的過程當中就排序的,就是數據插入的時候按照順序插入,因此memstore裏的數據是有序的。當memstore的數據刷寫到磁盤時,生成的storefile裏的數據也是有序的,這樣的話各個storefile裏的數據就分別有序了。合併的時候須要將各個有序的storefile合併成一個大的有序的storefile。
  • 首先將各個須要合併的storefile封裝成StoreFileScanner最後造成一個List加載到內存,而後再封裝成StoreScanner對象,這個對象初始化的時候會對各個StoreFileScanner進行排序放到內部的隊列裏,排序是按照各個StoreFileScanner最小的rowkey進行排序的。而後經過StoreScanner的next()方法能夠拿到各個StoreFileScanner最小rowkey中的最小rowkey對應的KV對。而後就把取出的KV對追加寫入合併後的storefile。由於每次取出的都是各個storefile裏最小的數據,因此追加寫入合併後的storefile裏的數據就是按從小到大排序的有序數據。
  • 就這樣完成了合併排序,思想跟歸併排序差很少,用的也很巧妙。

轉載:http://blog.sina.com.cn/s/blog_6ce72fe40101celq.htmlhtml

相關文章
相關標籤/搜索