NameNode启动之后,回加载fsimage和editlog文件重建文件系统目录树,但是对于数据块与DataNode之间的映射关系却需要在DataNode上报后动态构建。

DataNode启动之后,除了会与NameNode握手,注册以及上报数据块,还会定时向NameNode发送心跳及数据块副本汇报,并执行NameNode的传回的指令。所以NameNode中会有很大一部分逻辑是与DataNode相关的,包括添加和删除DataNode,与DataNode启动过程的交互、处理DataNode发送心跳

一 DataNodeDescriptor

DataNodeDescriptor是NameNode对DataNode的抽象,继承自DataNodeInfo,继承关系DatanodeID<-DatanodeInfo<-DataNode

Descriptor

DatanodeID:用于表示一个唯一的DataNode

DataNodeInfo:对DataNode的简单描述,比如容量,使用的空间,剩余空间,数据块池使用量,缓存容量,缓存使用量等

DataNodeDescriptor: 详细描述DataNode的类

状态相关:isAlive,decommissionStatus,curApproxBlocksScheduled

指令相关:bandwith,replicateBlocks,recoverBlocks,invalidateBlocks

缓存相关:pendingCache,cached.pendingUncached

二 DataNodeStroageInfo

DataNodeStroageInfo描述了DataNode上的一个存储,一个DataNode可以定义多个存储,这些存储可以是不相同的。

blockList:DataNodeStroageInfo最重要的数据结构,用来记录当前存储上保存的数据块副本链表的头结点。当DataNode报告NameNode成功接收一个数据块副本后,NameNode会调用DatanodeStorageInfo的addBlock方法在DatanodeStorageInfo的blockList添加这个副本对应的BlockInfo

状态相关:heartbeatedSinceFailover,当NameNode出现失败后,会将这个字段设置为false,正常接收心跳后,会将这个字段设置为true.

blockCOntentStale:当NameNode出现失败或者正在启动时,DataNode会挂起上一次NameNode发起的删除操作。这个时候我们就认为当前存储为stale状态,直到NameNode收到了这个存储的的块汇报

当DataNode向NameNode汇报该DataNode存储上接受到了一个新的数据块副本的时候,BlockManager会调用addBlock在NameNode的映射关系中添加。AddBlock首先调用BlockInfo.addStorage将自己也就是DatanodeStorageInfo对象添加到数据块所属的Datanodes存储列表中,也就是BlockInfo的triplets[],然后调用BlockInfo.listInsert将数据插入到DataNode存储管理的数据块链表中。

三 DataNodeManager

datanodeMap:维护StorageId-> DatanodeDescriptor的映射关系

host2DataNodeMap:维护host-> DataNodeDescriptor的映射关系

networktopology:维护整个网络的拓扑结构

添加和撤销DataNode

当我们需要增加容量,可以动态的向集群中添加新的DataNode;同理,当HDFS需要减小规模时,可以动态的撤销已经存在的Datanode.且两种情况都不影响HDFS服务

HDFS提供了dfs.hosts文件,又称include文件以及dfs.hosts.exclude文件管理接入到HDFS的datanode。

Include文件指定了可以连接到NameNode的DataNode列表,exclude文件指定了不能连接到NameNode的DataNode列表

HDFS管理员讲一个DataNode添加到集群中,需要在include文件中添加一条该DataNode的记录,然后调用dfsadmin–refreshNodes命令刷新名字节点的信息,最后才能启动DataNode

撤销节点,将要撤销的节点记录添加到exclude文件,也是调用dfsadmin–refreshNodes命令,被撤销的节点上的数据块就会复制到其他节点上

dfsadmin–refreshNodes会通过ClientProtocal.refreshNodes方法通知NameNode更新include和exclude文件,这个操作最终会由DataNodeManager.refreshNode方法完成,首先调用refreshHostReader将include与exclude文件加载到hostFileManager对象中,之后调用refreshDataNodes刷新所有的数据节点。

refreshDataNodes会遍历DatanodeManager.datanodeMap字段中保存的所有的DatanodeDescriptor对象,对不可以连接到NameNode的DataNode设置对应的DatanodeDescriptor.isAllowed字段为false.

DataNode心跳报告

通过DataNode的BlockPoolManager的BPServiceActor,DataNode的

BPServiceActor会向NameNode发送心跳,包括注册信息,存储信息,缓存信息等,NameNode收到之后,调用BlockManager.handleHeartBeat

方法返回一个心跳响应。这个心跳响应包括一个DatanodeCommand数组,用来携带NameNode对DataNode的指令,例如数据块副本的复制删除等

NameNode还会启动一个线程,周期性检测所有DataNode上报的心跳,对于长时间没有上报心跳的DataNode,则认为DataNode出故障,不能正常工作

NameNode之DataNode管理相关推荐

  1. namenode和datanode工作机制_Hadoop的namenode的管理机制,工作机制和datanode的工作原理...

    HDFS前言: 1) 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: 2)在大数据系统中作用: 为各类分布式运算框架(如:mapr ...

  2. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)

    1.2.4集群运维测试 HA集群中两个namenode状态的管理命令 [root@mini2 hadoop-2.6.4]# bin/hdfs haadmin Usage: DFSHAAdmin [-n ...

  3. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...

    1.2.4集群运维测试 HA集群中两个namenode状态的管理命令 [root@mini2 hadoop-2.6.4]# bin/hdfs haadmin Usage: DFSHAAdmin [-n ...

  4. hadoop中NameNode、DataNode和Client三者之间协作关系及通信方式介绍

    <ignore_js_op> 1)NameNode.DataNode和Client          NameNode可以看作是分布式文件系统中的管理者,主要负责管理文件系统的命名空间.集 ...

  5. NameNode与DataNode的工作原理剖析

    NameNode与DataNode的工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HDFS写数据流程 1>.客户端通过Distributed FileSys ...

  6. Secondary Namenode的Check point机制以及Namenode、Datanode工作机制说明

    目录 前言: 1.NameNode的工作机制 2.DataNode的工作机制 3.Secondary Namenode的Check point机制 目录 前言: 在说明checkpoint机制之前,先 ...

  7. HDFS体系结构(NameNode、DataNode详解)

    hadoop项目地址:http://hadoop.apache.org/ NameNode.DataNode详解 (一)分布式文件系统概述 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配 ...

  8. namenode和datanode工作机制_NameNode与DataNode的工作原理剖析

    NameNode与DataNode的工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HDFS写数据流程 1>.客户端通过Distributed FileSys ...

  9. 07-Hadoop HDFS之分布式文件系统、NameNode、DataNode和SecondaryNameNode的基础概念

    五.Hadoop-HDFS 5.1 Hadoop的历史 5.1.1Hadoop的进化史 Nutch Hadoop最早起源于Nutch. Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取. ...

最新文章

  1. 干货:Android 源码使用心得分享
  2. getcontentpane java_java – 为什么getcontentpane()未定义?
  3. 教你用webpack搭一个vue脚手架[超详细讲解和注释!]
  4. @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  5. C++:13---多态和虚函数表
  6. hadoop单机配置(非分布式)
  7. vs未指定启动文件_高效开发利器之自定义模板文件
  8. 前端工程师需要懂的前端面试题(c s s方面)总结(二)
  9. CSS3-多列布局-伸缩盒布局-伸缩项目
  10. Timeline使用手册
  11. 小米盒子 计算机共享,小米盒子如何通过局域网共享安装软件
  12. 软件工程---客观题
  13. 新浪再传将被转手 盛大卖股TOM集团接盘?
  14. 【Python】腾讯企业邮箱自动发邮件-发送多人并添加附件
  15. Macbook pro通过蓝牙连接BlackBerry拨号上网
  16. QQ等级查询API接口
  17. python静态函数
  18. java心形动画效果_java swing实现动态心形图案的代码下载
  19. SIM7600CE模块MQTT协议的AT指令流程
  20. 极客时间专栏内容的个人分析

热门文章

  1. c语言非法字符空格,98行的四则计算器.(支持括号)加入了非法字符的检测
  2. 牛客网 java刷题_牛客网刷题(纯java题型 1~30题)
  3. 3-15Pytorch与分布函数
  4. linux操作指令训练,实验二linux 常用命令练习
  5. html5点击事件_lt;detailsgt; | HTML5 详细内容标签
  6. php 5.2 thinkphp 3.2.2 cache,查询缓存-ThinkPHP3.2.3完全开发手册
  7. 铺铜需要把agnd和dgnd分开_AGND和DGND的秘密——混合信号器件的接地原则
  8. Spring Cloud Sleuth + Zipkin + RabbitMQ +MySQL(三)
  9. 鸿蒙服务卡片-哔哩哔哩弹幕姬
  10. python计算N维数据的笛卡尔积