相关文章链接:
http://blog.csdn.net/hljlzc2007/article/details/10980949
http://www.th7.cn/db/nosql/201612/217383.shtml
源文档 <http://cache.baiducontent.com/c?m=9d78d513d98316f005a9c3690c66903a4503d7356b81c7140f80c816c4254f060738ece161645213d2b6617a44ea0c4bea877028321420c0ca94951c8da6ce756ecb7929701e854511d304afc84324cb21875a9eee43a1e5ae&p=97769a4786cc42ac5ebbd32156428c&newp=8b2a97068c8b11a05bee9225515686231615d70e3cd4d3166b82c825d7331b001c3bbfb423231b06d2c67d6405aa4c58eefb3075320821a3dda5c91d9fb4c57479cb7d7c&user=baidu&fm=sc&query=removeUnneededFiles&qid=ba60d72c0046b0c0&p1=3>
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级别的读锁
