欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

DataNode之DirectoryScanner分析讲解

程序员文章站 2022-03-23 20:07:57
DirectoryScanner的作用就是定期扫描磁盘上的数据块,检查磁盘数据块信息是否和FsDataSetImpl的数据块信息一致,如果不一致则进行更新,他只会检查内存和磁盘上FINALIZ...

DirectoryScanner的作用就是定期扫描磁盘上的数据块,检查磁盘数据块信息是否和FsDataSetImpl的数据块信息一致,如果不一致则进行更新,他只会检查内存和磁盘上FINALIZED状态的数据块是否一致

比较核心的字段:

异步收集磁盘上数据块信息的线程池

privatefinal ExecutorServicereportCompileThreadPool;

主线程,定期调用run方法,执行整个扫描逻辑

privatefinal ScheduledExecutorServicemasterThread;

描述磁盘上保存的数据块信息和内存之间差异,在扫描过程中更新,扫描结束后,把diffs更新到FsDatasetImpl

final ScanInfoPerBlockPooldiffs = newScanInfoPerBlockPool();

voidstart() {

shouldRun = true;

long offset = DFSUtil.getRandom().nextInt((int) (scanPeriodMsecs/1000L)) * 1000L; //msec

long firstScanTime = Time.now() +offset;

//定期调用这个线程类,然后执行这个类的run方法

masterThread.scheduleAtFixedRate(this,offset, scanPeriodMsecs,

TimeUnit.MILLISECONDS);

}

public voidrun() {

//......

reconcile();

//......

}

/**

*调节磁盘上和内存上数据块的不同

*/

voidreconcile() throws IOException {

//在磁盘和内存的blocks扫描不同,只是扫描那些FINALIZED标记的数据块

scan();

for (Entry>entry : diffs.entrySet()) {

Stringbpid = entry.getKey();

//遍历差异信息

LinkedListdiff = entry.getValue();

//更新FsDataset保存的数据块

for (ScanInfo info :diff) {

dataset.checkAndUpdate(bpid,info.getBlockId(),info.getBlockFile(),

info.getMetaFile(),info.getVolume());

}

}

if (!retainDiffs)clear();

}