Hbase storefile合并排序

Posted 心随风飞930

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.html

以上是关于Hbase storefile合并排序的主要内容,如果未能解决你的问题,请参考以下文章

大数据(5b)HBase架构读写流程

2021年大数据HBase(十四):HBase的原理及其相关的工作机制

2021年大数据HBase(十四):HBase的原理及其相关的工作机制

合并排序——二路合并排序

合并 k 排序数组 - 优先队列与传统合并排序合并,何时使用哪个?

java 合并排序数组 - 合并两个排序的数组