终于可以开始分析ReplicationMonitor,他依赖了其他的任务数据,我们先来看看他的类的java doc
/**
* Periodically calls computeReplicationWork()
*/
说明反而没有说具体的工作内容,而是直接说call某个方法,看方法名字也好理解,就是执行一些复制的工作,那么在复制决策执行前肯定需要做调研了,调研完了再按照一定的准则执行特定的复制操作了。
好我们首先看下复制检测的时间间隔
this.replicationRecheckInterval = conf.getInt("dfs.replication.interval", 3) * 1000L;
//dfs.replication.interval=3 默认的设置,注意单位是秒
看这个时间间隔貌似算是最小的了,3秒就会检测一次是否需要复制数据了,看来干活很给力。
我们先来看下run方法里的逻辑:
1:computeDatanodeWork(); //计算块复制情况(例如少了还是多了)
2:processPendingReplications(); //处理那些复制超时的块请求
我们首先看下computeDatanodeWork()这个方法的java doc
/**
* Compute block replication and block invalidation work
* that can be scheduled on data-nodes.
* The datanode will be informed of this work at the next heartbeat.
*
* @return number of blocks scheduled for replication or removal
*/
其实这个返回值根本就没有用到,连个log也没打
在进行计算block复制数前需要验证是否处于安全模式下,针对这点注释里写的很明白(后面要把这个safeMonitor后台任务加入分析)
// blocks should not be replicated or removed if safe mode is on
因为检测的频率过高,为防止检测过多的节点和数据块,在检测时设置了一些阈值来限定当此检测的范围,例如
static final int INVALIDATE_WORK_PCT_PER_ITERATION = 32;
static final float REPLICATION_WORK_MULTIPLIER_PER_ITERATION = 2;
blocksToProcess = (int)(heartbeats.size()
* ReplicationMonitor.REPLICATION_WORK_MULTIPLIER_PER_ITERATION);
nodesToProcess = (int)Math.ceil((double)heartbeats.size()
* ReplicationMonitor.INVALIDATE_WORK_PCT_PER_ITERATION / 100);
ArrayList<DatanodeDescriptor> heartbeats
针对上面的计算公式,例如我有100个datanode节点,则hearbeats.size ==100 ,那么在3秒的时间内处理的限制数就是blockToProcess = 200 nodeToProcess = 32
好进入正题,首先是选择那些需要复制的块,那些需要复制的块保存在下面这个数据结构中
// Store set of Blocks that need to be replicated 1 or more times
UnderReplicatedBlocks neededReplications
我们看下这个结构的内部实现
/* Class for keeping track of under replication blocks
* Blocks have replication priority, with priority 0 indicating the highest
* Blocks have only one replicas has the highest
*/
private List<TreeSet<Block>> priorityQueues = new ArrayList<TreeSet<Block>>();
利用这个实现了一个优先级有序队列,优先级一共只有4级 (0,1,2,3),同时block实现了Comparable接口,依据blockId和生成时间来做比较。
那么是谁将复制请求传递过来的呢,追踪代码看有以下几种情况:
1:当lease被删除时,需要检测和这个租约关联的hdfs文件的block数是否和期望的一致,如果小于期望值则将这个块加入到需要复制队列中
2:当离开安全模式时需要校验块的复制情况,如果没达到复制因子的则加入到需要复制队列中
3:当datanode注册到namenode时需要校验这个datanode是否处于正准备退役阶段,如果是那需要检测该datanode节点上的所有block的复制数是否已经达到复制因子,如果没有则需要加入到需要复制队列中
4:当DecommissionManager的监控线程执行检测时,如果发现某个退役节点处于正准备退役阶段,则对该退役节点的所有块执行检测,查看是否达到复制因子,如果没有达到则将该block加入到需要复制队列中
好了有了来源我们就看看下面的逻辑, 从neededReplications中先选出blocksToProcess大小的block,然后经过一系列复杂的逻辑判断,看是否需要真正的复制,如果需要就将block加入到pendingReplications队列中。
同时还存在一个recentInvalidateSets 这个集合里存储了当时无效的block,这里会计算这里面的block还是否有效。
接下来看 processPendingReplications,这个的逻辑比较简单,就是将pendingReplicationMonitor中监控到的超时复制请求重新放入neededReplications中去。
好了我们已经看到block需要被复制的逻辑了,那么到底是谁执行复制的具体操作呢,追踪下发现是
DatanodeDescriptor.addBlockToBeReplicated(block, targets);该方法将需要复制的功能交给了datanode自己来做,datanode发送心跳信息时会接收到一个需要传递数据的commond,然后依据command里的参数来执行对应的传送数据的请求。
分享到:
相关推荐
NameNode是Hadoop分布式文件系统HDFS的核心组件之一,负责维护文件系统的元数据。下面是NameNode的职责和相关知识点: NameNode的职责 NameNode是HDFS的中心节点,负责维护文件系统的命名空间。它的主要职责包括:...
Hadoop 2.0 双 Namenode 双 Datanode 部署 Hadoop 是一个开源的大数据处理框架,它提供了分布式文件系统(HDFS)和Map/Reduce 计算框架。 在这个部署中,我们将使用 Hadoop 2.0 在两个 Ubuntu 服务器上部署双 ...
2. **jstack+脚本**:通过jstack工具获取NameNode进程中的线程快照,并结合脚本自动化分析这些快照,寻找可能的死锁或阻塞情况。 3. **利用x86 PMU的Profiling工具**:利用Oprofile或Intel Vtune等工具对NameNode...
文件名“都是海量惹得祸 之 大家来聊Namenode瓶颈解决方案.pptx”表明这是一个关于Namenode问题的演讲或报告,可能详细阐述了大数据量对Namenode的影响,分析了问题的根源,并提供了具体的解决方案。 在实际解决...
HDFS 中 NameNode 节点的配置、备份和恢复 HDFS(Hadoop Distributed File System)是 Hadoop 生态系统中的分布式文件系统,它提供了高效、可靠、可扩展的文件存储解决方案。 NameNode 是 HDFS 集群中的中心服务器...
在Hadoop分布式文件系统(HDFS)中,Namenode是关键组件,它负责元数据管理,包括文件系统的命名空间和文件的块映射信息。当Namenode启动失败时,通常与fsimage和edits文件有关,这些文件是Namenode存储元数据的重要...
[bigdata@namenode1 scripts]$ pwd /home/bigdata/software/hadoop/share/scripts [bigdata@namenode1 scripts]$ python configuration-utils.py -c 2 -m 8 -d 30 -k True Using cores=2 memory=8GB disks=30 hbase=...
4. **Replication Monitor线程(replthread)**:这个线程运行`ReplicationMonitor`,负责数据块的复制工作。它定期调用`computeDatanodeWork`和`processPendingReplications`。`computeDatanodeWork`从`...
NameNode作为Hadoop分布式文件系统(HDFS)的核心组件之一,负责管理整个文件系统的命名空间以及客户端的文件访问。为了保证元数据的安全性和持久性,NameNode在运行过程中需要将元数据保存在内存中,并同时在磁盘中...
Hadoop之NameNode Federation图文详解 Hadoop的NameNode Federation是HDFS(Hadoop Distributed File System)中的一种架构设计,旨在解决NameNode的扩展性、隔离性和性能问题。本篇文章将对NameNode Federation的...
Hadoop Namenode 是 Hadoop 分布式文件系统的核心组件之一,负责管理文件系统的命名空间。然而,在生产环境中,namenode 的崩溃可能会导致整个集群的不可用。因此,namenode 的恢复是非常重要的。本文将详细介绍 ...
hdfs的namenode的元数据管理机制,简要画出了元数据管理的流程分析
Hadoop 的 NameNode 是 Hadoop 分布式文件系统(HDFS)的核心组件之一,负责管理文件系统的 namespace 和数据块的存储位置。在本文中,我们将深入探讨 Hadoop NameNode 的源码,了解其启动过程、配置加载、RPC ...
在IT行业中,高可用性是关键,特别是在大数据处理领域,Hadoop作为分布式计算框架,其NameNode节点的稳定性至关重要。"hadoop namenode双机热备"是为确保Hadoop集群持续运行而采取的一种重要策略,通过双机热备可以...
在Hadoop大数据存储系统中,HDFS(Hadoop Distributed File System)是核心组件之一,用于分布式存储大量数据。NameNode是HDFS的核心节点,负责管理文件系统的元数据,包括文件和目录的命名空间以及文件的块映射信息...
在分布式文件系统Hadoop的HDFS(Hadoop Distributed File System)中,NameNode是核心组件,负责元数据的管理,包括文件系统命名空间和文件块的映射信息。当NameNode发生故障时,数据的可用性和系统的稳定性都会受到...
- **说明**:该变量表示一个处理回收站任务的线程句柄。 - **作用**:定期清理文件系统的回收站目录,释放不再使用的文件或目录资源。 4. **`private int handlerCount = 2;`** - **说明**:定义了服务器请求...
NameNode及SecondaryNameNode分析
小文件指的是大小相对较小的文件,它们在分布式系统中可能导致大量的数据块,增加NameNode的内存负担,降低I/O效率。为了解决这个问题,我们可以采用各种合并策略,其中一种是通过多线程并行合并小文件。本项目提供...