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<String, LinkedList<ScanInfo>>entry : diffs.entrySet()) {

Stringbpid = entry.getKey();

//遍历差异信息

LinkedList<ScanInfo>diff = entry.getValue();

//更新FsDataset保存的数据块

for (ScanInfo info :diff) {

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

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

}

}

if (!retainDiffs)clear();

}

DataNode之DirectoryScanner分析相关推荐

  1. DataNode之BlockSender分析

    一 BlockSender发送数据的格式详解 BlockSender主要负责从DataNode的磁盘读取数据块,然后发送数据块到接收方.需要注意的是,BlockSender发送的数据是以一定的结构组织 ...

  2. DataNode进入Stale状态问题排查

    先说下DataNode为啥会处于Stale状态 默认情况下,DataNode每3s向NameNode发送一次心跳,如果NameNode持续30s没有收到心跳,就把DataNode标记为Stale状态: ...

  3. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  4. Hadoop源代码分析(完整图文版) part 1

    在网上看到了很多此文章的装载,但是都是纯文字,这篇文章在没有图片的情况下阅读起来意义不大了.花了点时间上传了100多张图片,希望对大家学习hadoop有帮助. Hadoop源代码分析(一) 关键字:  ...

  5. 小朱笔记之hadoop应用实战、源码分析-目录

    小朱笔记之hadoop应用实战.源码分析 1.1 背景目的 该笔记从宏观架构.安装配置.源码分析.使用案例四个方面剖析了Hadoop1.0.3,希望能对同学们提供帮助,赠人玫瑰,手留余香.能够把had ...

  6. Hdfs NameNode中数据块管理与数据节点管理分析

    数据块管理 在上一节介绍了BlockManager中的数据块副本状态,主要是保存各个数据块副本状态的存储对象.名字节点第二关系的管理包括数据块管理和数据节点管理,其对数据块的管理是依托于BlockMa ...

  7. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.  GoogleCluster:http:/ ...

  8. Hadoop的学习笔记(Hive|pig|zookeeper|hbase)

    轉載的,此筆記的鏈接地址請點擊此處 hadoop笔记本 <div class="postText"><div id="cnblogs_post_body ...

  9. 大数据开发工程师目录

    阶段一:走进大数据 第1周   学好大数据先攻克Linux 在步入大数据殿堂之前,先带领大家快速掌握大数据的必备技能:Linux的操作使用,为后面学习大数据技术打下坚实基础. 课程安排: 1.掌握Li ...

最新文章

  1. python如何定义类_Python 面向对象
  2. LSTM终获「正名」,IEEE 2021神经网络先驱奖授予LSTM提出者Sepp Hochreiter
  3. 上传数据,直接分析,这才是真正的生物云
  4. DevOps和容器:本地or云端,如何选择?
  5. 桌面桌面虚拟化-Vmware 兼容性怎么查询
  6. 2019信安国赛逆向easyGo,bbvvmm题解
  7. spring源码分析第三天------spring核心IOC容器和依赖注入原理
  8. Web前端笔记-2D图形平面内平移定位(two.js)
  9. DD-WRT基础扫盲
  10. 论文笔记:微表情识别综述1
  11. 史上最全最准的支付行业常用名词解释精选
  12. 抽象代数笔记-群、子群、商群
  13. 链队列——-链式存储实现队列的入队出队(带next,front,rear指针)
  14. 解决react项目启动报错:error Couldn't find a package.json
  15. HTML+CSS一篇文章搞定
  16. 什么是UEFI启动?
  17. MAX98390CEWX D类放大器,集成动态扬声器管理(MAX98390)
  18. 通过window.open下载pdf或直接打开文件
  19. 笔记 | 数据分析产品未来范式的小结(增强分析、智能交互等)
  20. java 获取字符串最后的数字

热门文章

  1. JavaScript变量高级定义之Object.defineProperty()方法讲解
  2. android开发所遇问题集(一)----Mr.Zhang
  3. android 获取cpu型号_当贝投影带你认识投影仪CPU芯片有哪些?网友:真详细
  4. Mybatis plus 开启日志
  5. windows更改pip源_windows环境下 更换pip镜像源
  6. 左侧栏下拉框HTML代码,html5下拉菜单代码
  7. linux查看后台执行的所有任务与对应的命令
  8. php.ini 没有pdo,php.ini 没有pdo怎么办
  9. vant在cell中加表格_Vant Cell 单元格
  10. 软件测试计划和测试报告