`

[转发]hdfs源码namenode部分概述(二)

 
阅读更多

http://www.cnblogs.com/wangyonghui/archive/2011/09/07/2169565.html 写道
接着讲另外几个数据结构。
1.CorruptReplicationMap
成员变量:Map<Block, Collection<DatanodeDescriptor>> corruptReplicasMap用来记录datanode上出错的block,getNodes方法返回一个block在哪些datanode上的副本是corrupt的。在FSNamesystem中使用corruptReplicas保存这个map结构。
坏掉的block将放入recentInvalidateSets(Map<String, Collection<Block>>)中,Client或者datanode 通过reportBadBlocks报告出错的block,namenode调用FSNamesystem的markBlockAsCorrupt方法处理。
2.recentInvalidateSets
成员变量:Map<String, Collection<Block>> recentInvalidateSets
保存了每个Datanode上无效但还存在的block(StorageID-> ArrayList<Block>)
replthread后台任务线程中的computeInvalidateWork方法(实际方法是invalidateWorkForOneNode)取出map里第一个datanode节点上所有无效的block,然后将这个block列表设置到invalidateSet集合中,namenode收到心跳信息会依据自己保存的invalidateSet集合来生成一个invalidate blocks的命令返回给datanode,让datanode来处理这些无效的block。
3.UnderReplicatedBlocks
主要的成员是一个优先队列,List<TreeSet<Block>> priorityQueues,保存副本数没有达到期望值的block。根据当前副本数低于期望值的程度决定优先级,差的越远,优先级越大(0~2,0最大)。每个优先级别对应一个TreeSet,getPriority获得优先级后决定放入哪个treeset中。
在FSNamesystem中使用neededReplications保存低于规定副本数的block信息。
涉及neededReplications的一些操作:
当datanode注册到namenode时需要校验这个datanode是否处于正准备退役阶段,是则需要检测该datanode节点上的所有block的复制数是否已经达到复制因子,如果没有则需要加入到neededReplications中 ;
当DecommissionManager的监控线程dnthread执行检测时,如果发现某个退役节点处于正准备退役阶段,则对该退役节点的所有块执行检测,查看是否达到复制因子,如果没有达到则将该block加入到neededReplications中;
当lease被删除时,需要检测和这个租约关联的文件的block数是否和期望值一致,如果小于期望值则将这个块加入到neededReplications中;
当离开安全模式时需要校验block的副本情况,如果没达到副本因子数则加入到neededReplications中;
processPendingReplications方法将pendingReplicationMonitor中监控到的超时的副本拷贝请求重新放入neededReplications中去。
4.PendingReplicationBlocks
主要的成员是Map<Block, PendingBlockInfo> pendingReplications用来保存正在复制的数据块的相关信息。该类中还有一个timerThread,检测副本是否超时的线程;副本拷贝超时(5min)未成功的block 放入到ArrayList<Block> timedOutItems中。
超时的block在FSNamesystem的processPendingReplications方法中又将 timedOutItems 清空, 添加到neededReplications中。
5.excessReplicateMap
Map<String, Collection<Block>> excessReplicateMap
保存Datanode上有效但需要删除的数据块(StorageID -> TreeSet<Block>)比如一个Datanode故障恢复后,上面的数据块在系统中副本数太多,需要删除一些数据块。
6. LeaseManager
hdfs支持write-once-read-many,也就是说不支持并行写,那么对读写的互斥同步就是靠Lease实现的。Lease说白了就是一个有时间约束的锁。客户端写文件时需要先申请一个Lease,对应到namenode中的LeaseManager,客户端的client name就作为一个lease的holder,即租约持有者。LeaseManager维护了文件的path与lease的对应关系,还有clientname->lease的对应关系。LeaseManager中有两个时间限制:softLimit and hardLimit。
软限制就是写文件时规定的租约超时时间,硬限制则是考虑到文件close时未来得及释放lease的情况强制回收租约。
LeaseManager中还有一个Monitor线程来检测Lease是否超过hardLimit。而软租约的超时检测则在DFSClient的LeaseChecker中进行。
当客户端(DFSClient)create一个文件的时候,会通过RPC 调用 namenode 的createFile方法来创建文件。进而又调用FSNameSystem的startFile方法,又调用 LeaseManager 的addLease方法为新创建的文件添加一个lease。如果lease已存在,则更新该lease的lastUpdate (最近更新时间)值,并将该文件的path对应该lease上。之后DFSClient 将该文件的path 添加 LeaseChecker中。文件创建成功后,守护线程LeaseChecker会每隔一定时间间隔renew该DFSClient所拥有的lease。

另外还有一个数据结构:datanodemap,它保存了StorageID -> DatanodeDescriptor的映射,用于保证DataNode使用的Storage的一致性。

至此,namenode上的关键数据结构已经基本上讲完了。
接下来就是namenode上的一些监控线程。
1. HeartbeatMonitor thread
datanode周期性通过RPC调用sendHeartbeat向namenode汇报自身的状态,心跳监控线程对dn和nn之间的心跳进行周期性检测,每隔时间heartbeatRecheckInterval 就执行操作heartbeatCheck()。
heartbeatCheck找到heartbeats中的dead nodes,然后从heartbeats 、clusterMap 、blocksmap这些结构中移除这些dead nodes的信息。
 
分享到:
评论

相关推荐

    hdfs源码.zip

    1.1 HDFS概述 1 1.1.1 HDFS体系结构 1 1.1.2 HDFS基本概念 2 1.2 HDFS通信协议 4 1.2.1 Hadoop RPC接口 4 1.2.2 流式接口 20 1.3 HDFS主要流程 22 1.3.1 HDFS客户端读流程 22 1.3.2 HDFS客户端写流程...

    Hadoop源代码分析之HDFS篇.

    在深入分析Hadoop HDFS的源代码之前,我们先对Hadoop HDFS的基本架构和功能进行概述。HDFS,即Hadoop分布式文件系统,是一个高度容错性的系统,旨在存储和处理大规模数据。HDFS的核心组件包括NameNode和DataNode。 ...

    hadoop源码.zip

    《深入剖析Hadoop HDFS源码》 在大数据处理领域,Hadoop作为开源框架的代表,因其高效、可扩展和容错性强等特点,备受开发者喜爱。尤其对于HDFS(Hadoop Distributed File System),它是Hadoop的核心组件,负责...

    hadoop源码阅读总结

    ### Hadoop源码阅读总结:IPC/RPC 通信机制详解 #### 一、概述 Hadoop作为分布式计算框架,其内部各个组件之间的通信主要通过RPC(Remote Procedure Call)实现。本文将详细介绍Hadoop中RPC机制的工作原理,特别是...

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    第1章 HDFS HA及解决方案 1.1 HDFS系统架构 1.2 HA定义 1.3 HDFS HA原因分析及应对措施 1.3.1 可靠性 1.3.2 可维护性 1.4 现有HDFS HA解决方案 1.4.1 Hadoop的元数据备份方案 1.4.2 Hadoop的SecondaryNameNode方案 ...

    Hadoop源码分析 完整版 共55章

    - **HDFS组成部分**:HDFS由NameNode、DataNode和Client组成,分别负责元数据管理、数据块存储以及客户端请求处理。 #### 五、深入分析MapReduce - **MapReduce章节**:MapReduce部分共14章,这部分将详细介绍...

    Hadoop_HDFS安装和管理

    #### 一、Hadoop HDFS概述 Hadoop是一种分布式计算框架,主要用于处理大规模数据集。它由多个组件组成,其中最核心的是Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS是一个高度可扩展的文件系统,用于...

    hdfsexplorer代码

    【HDFS(Hadoop Distributed File System)概述】 HDFS,全称为Hadoop分布式文件系统,是Apache Hadoop项目的核心组件之一。它是一个高度容错性的分布式文件系统,设计用于跨大量廉价硬件节点运行,旨在处理和存储...

    Hadoop2.6.4的源码包

    3. **HDFS源码解析** - **NameNode**:管理文件系统的元数据,包括文件、块和目录的映射关系。理解NameNode的工作流程,包括启动、元数据操作、故障恢复等,对于掌握HDFS至关重要。 - **DataNode**:存储数据块,...

    Hadoop源码分析完整版

    Hadoop由Apache基金会开发,其核心包括两个主要部分:Hadoop Distributed File System (HDFS)和MapReduce。HDFS为大规模数据提供了可靠的分布式存储,而MapReduce则负责大规模数据的并行处理。 2. **HDFS详解** -...

    hadoop-2.5.0-cdh5.3.6-src.tar.gz

    HDFS由NameNode和DataNode组成,NameNode负责元数据管理,DataNode则存储实际数据。源码中,`hdfs-client`提供了客户端接口,`hdfs-server`包含了服务器端的相关实现。 6. YARN详解: YARN将资源管理和应用程序...

    Hadoop源码分析(client部分)

    6. **HDFS源码分析**:研究HDFS如何实现高效的数据存储和访问机制,这对于理解大数据处理中的数据管理至关重要。 7. **Google ProtoBuf源代码分析**:了解Google的ProtoBuf是如何实现高效的序列化和反序列化,有助于...

    Hadoop从入门到上手企业开发

    028 HDFS 文件系统架构概述 029 HDFS架构之NameNode和DataNode 030 HDFS 架构讲解总结 031 回顾NameNode和DataNode 032 HDFS架构之Client和SNN功能 033 HDFS Shell 命令命令讲解和演示 034 讲解HDFS 文件读写流程 ...

    零基础学习Hadoop3.0从入门到源码

    ├─1.HDFS │ ├─视频-零基础学习Hadoop3.0-HDFS从入门到源码 │ │ │ 00--课程内容大纲和学习目标.mp4 ...│ │ │ 16--Hadoop概述--集群搭建--namenode format操作及注意事项.mp4 │ │ ├─

    hdfs+mapredece+hive+zookeeper集群管理

    Hadoop是Apache基金会开源的一个分布式计算框架,它主要由HDFS(Hadoop Distributed File System)和MapReduce两部分组成。HDFS提供了高容错、高吞吐量的数据存储,而MapReduce则负责大规模数据集的并行计算。Hadoop...

    hadoop权威指南4和源码

    6. **Hadoop源码分析**:通过阅读Hadoop源码,可以深入了解其内部机制,例如NameNode如何管理文件系统元数据、DataNode如何进行数据块的读写、MapReduce的作业调度算法等。这对于优化Hadoop集群性能、开发自定义插件...

    Hadoop实战初级部分PPT及源码下载

    1. **HDFS**:学习HDFS的架构,包括NameNode、DataNode和Secondary NameNode的角色,以及它们如何协同工作以确保数据的可靠存储和访问。 2. **MapReduce**:理解Map阶段和Reduce阶段的执行流程,以及如何编写...

    hadoop-2.6.5-src

    2. **HDFS源码分析** - **NameNode**: HDFS的元数据管理节点,负责维护文件系统的命名空间和文件块信息。在源码中,主要关注`org.apache.hadoop.hdfs.server.namenode`包下的类,如`FSDirectory`和`NameNode`。 - ...

Global site tag (gtag.js) - Google Analytics