COMPACT分析

来源:互联网 发布:opencv sobel算法实现 编辑:程序博客网 时间:2024/05/16 19:15

相关文章链接:

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请求:

1removeUnneededFiles

计算机生成了可选文字: 厂任丁一2’任石丫于勺产十,舀~re,oveUrineededFiles()

1.1、获取Store级别的读锁

计算机生成了可选文字: this.lock.readLock().lock()

1.2、逐个遍历Store中的StoreFiles,找出超出时间范围的StoreFiles,这些StoreFiles不做compaction

计算机生成了可选文字: de1Sfs二storeEnglne.getstoreFile贾anager().getUnneededFiles(Enviro,entEdge贾anager.currentTime()一c打tl,filesCoopacting);

1.3、先将这些不需要compaction的文件加入到filesCompacting列表中

计算机生成了可选文字: 产*Addst为efi1estoco刀p目c金ing凡!es.凡lesCoJZpac金ing侧stbelocke己州privatevoldad盯oCo帅actingFiles(finalCollection<StoreFile>filesToAdd){if(fi1esToAdd二二null)returnJ//Checkth刁t悴edonottrytoco兀p刁ctthesa功eStor即ilet耐ce.if(!Collections.disjo主nt(filesCo帅actlng,filesToAdd)){Preconditions.check八rg~:(:false,'%5overlaps,ith%s口,filesToAdd,fllesCo帅acting)}fl1esCo帅actlng.addAll(filesToAdd)'Collections.sort(fllesCo即actlng,StoreFile.Co卯arators.SE免ID);}

1.4、释放Store级别的读锁

计算机生成了可选文字: finally{thls.lock.readLock().unlock()

1.5、将这些不需要compaction的文件写入WAL,标记为已经compaction完成的文件

计算机生成了可选文字: ",曰.、‘J日‘'.JJ曰占‘J‘、曰‘、.‘勺“‘、工、,,悯了iteCactio喇a1Record(de1Sfs,newFiles)

2、构造compaction请求

计算机生成了可选文字: flna1CactionContextCo帅acti。n二storeEnglne.createCo帅action()

3、获取Store级别的读锁

计算机生成了可选文字: this.lock.readLock().lock()

4、判断是否是major compaction,如果不是,则将队列中大于MAX_COMPACTION_SIZE的文件移除,如果是user触发的,一定是major;如果是系统触发的,需要进行判断是否是AllFiles,如果是则major,不是则minor

计算机生成了可选文字: try{co帅action.select(this.filesCo帅acting,isUserCo卯action,mayUseof开eak,,~~一forcelajor&&filesCo帅acting.iSE卿ty());

5、将所有要做compaction的文件加入到filesCompacting队列中

计算机生成了可选文字: re职est二co帅action.getRe职est();flnalCollection<StoreFile>selectejiles二re职est.getFiles()If(selectedFiles.isE帅ty()){returnnull

5.1、将所有的需要合并的storeFiles加入filesCompacting

计算机生成了可选文字: /**AddSthefi1estocoJZpact主ngfiles.filesCo兀pacting侧stbelocked.*/prlvatevoidaddToCo帅actlngFlles(flnalCollection<StoreFile>filesToAdd){If(fi1esT。Add二二null)return』刀助eck角atwedonottrytoco卿act角es~Stor可月et戒“.If(ICollections.disjoint(fllesCo帅actlng,filesToAdd)){Preconditions.chec沁廿g~t(false,,马5overl即s,ith%s,,filesToAdd,filesCo帅actlng)}fi1esCo帅acting.addAll(filesToAdd);Collections.sort(fllesCo帅actlng,StoreFile.Co印arators.SE几ID);}

6、释放Store级别的读锁

计算机生成了可选文字: }finally{thls.lock.readLock().unlock()}

 

 

构造完成Compaction请求后,接下来就是真正执行Compaction操作了,具体实现如下:

1、获取Region级别的读锁

计算机生成了可选文字: lock.readLock().lock()

2、在HStore中执行合并操作

计算机生成了可选文字: status.setstatus(,Co即actingstore,+store)'//即enolongerneedtocancelt力erequestont力e份旦youtoft力15//met力odbecauseStore#cOJZ,act心11clean即unconditionallyre妙estNeedgCancellation二false:store.c。卿act(co冲action,throughPutController,user)J

2.1、执行compaction操作,并返回合并后的newFiles

计算机生成了可选文字: 刀Co兀盯℃ncet力ec0IZp刁ction.List<Path>newFiles二co帅action.co帅act(throug饰utController,user)

2.1.1、为每个选取的store创建一个scanner

计算机生成了可选文字: readersToClose二Collections.即ptyList()SCannerS二Store.createFilescanners(re叩est.getFiles(),smallestReadPoint,throttleCo卯action(re职est.getsize()));}

2.1.2、将所有storeFilescannsers封装成一个StoreScanner

计算机生成了可选文字: if(scanner二二null){SCanner二createscanner(store,scanners,scanT扣e,smallestReadPoint,fd.earllestPutTs);}

2.1.3、根据先后顺序,将每个多个scanner合并成有序的数据,放入writer

计算机生成了可选文字: booleanfinished二perforllCo帅action(fd.SCallner附iter,s功allestReadPoint,cleanseqld.throug饰utController,re叫est.isAllFiles())

2.1.4、将writer落地到磁盘

2.2、为新的newFiles生成对应的StoreFiles,并创建Reader,并加入onlineStorefiles队列中

计算机生成了可选文字: for(Pathne叮ile:ne叮iles){/Createstore几le盯ound汕刁t附叹rote叭thareaderon1t.StoreFilesf二createstoreFileAndReader(ne叮ile)'sf.closeReader(evictonClose)'sfs.add(sf);}

3、释放Region级别的读锁

0 0
原创粉丝点击