相关文章链接:
http://blog.csdn.net/hljlzc2007/article/details/10980949
http://www.th7.cn/db/nosql/201612/217383.shtml
http://blog.csdn.net/lipeng_bigdata/article/details/50807990
http://blog.csdn.net/lipeng_bigdata/article/details/50782466
http://blog.csdn.net/lipeng_bigdata/article/details/50791205
http://blog.csdn.net/lipeng_bigdata/article/details/50803085
调用点:CompactSplitThread中的run函数,run函数中主函数是doCompaction
具体实现如下:
首先构造compaction请求:
1、removeUnneededFiles
1.1、获取Store级别的读锁
1.2、逐个遍历Store中的StoreFiles,找出超出时间范围的StoreFiles,这些StoreFiles不做compaction
1.3、先将这些不需要compaction的文件加入到filesCompacting列表中
1.4、释放Store级别的读锁
1.5、将这些不需要compaction的文件写入WAL,标记为已经compaction完成的文件
2、构造compaction请求
3、获取Store级别的读锁
4、判断是否是major compaction,如果不是,则将队列中大于MAX_COMPACTION_SIZE的文件移除,如果是user触发的,一定是major;如果是系统触发的,需要进行判断是否是AllFiles,如果是则major,不是则minor
5、将所有要做compaction的文件加入到filesCompacting队列中
5.1、将所有的需要合并的storeFiles加入filesCompacting
6、释放Store级别的读锁
构造完成Compaction请求后,接下来就是真正执行Compaction操作了,具体实现如下:
1、获取Region级别的读锁
2、在HStore中执行合并操作
2.1、执行compaction操作,并返回合并后的newFiles
2.1.1、为每个选取的store创建一个scanner
2.1.2、将所有storeFile的scannsers封装成一个StoreScanner
2.1.3、根据先后顺序,将每个多个scanner合并成有序的数据,放入writer中
2.1.4、将writer落地到磁盘
2.2、为新的newFiles生成对应的StoreFiles,并创建Reader,并加入onlineStorefiles队列中
3、释放Region级别的读锁