NameNode对三大协议接口(NamenodeProtocol、ClientProtoco、DatanodeProtocol)进行实现,利用ipc::Server通过三个协议分别向SNN、Client、DN提供RPC服务(参考:Hadoop IPC);

NameNode的核心是FSNamesysem;

FSNamesystem持有几大主要数据结构:FSDirectory维护系统目录结构、BlocksMap维护数据块信息、LeaseManagr维护租约信息;此外,还通过DatandeDescriptor、corruptReplicas等维护数据结点(DN)状态、坏副本等信息;

FSDirectory通过FSImage及FSEditLog保存目录结构的某一时刻镜像(image)及对镜像的修改(edit);其中,修改的内容可以通过EditLogOutputStream写出;

Namespace(命名空间)

HDFS的Namespace(命名空间)用于记录系统中目录、文件、块之间的映射关系。

Namespace的内存结构

与传统使用习惯相同,HDFS使用了一棵树形结构。示意图如下:

INodeDirectory -/
|--- INodeFile -/
|--- BlockInfo
|--- BlockInfo
|--- INodeDirectory -/
|--- INodeFile
|--- INodeFile

INodeDirectory代表目录,目录可以映射到子目录及文件,文件映射到相关的文件块。

最顶层的目录—根目录(rootDir)由FSDirectory结构记录。

Namespace的外存存储

在需要的时候,NameNode可以将Namespace写出到磁盘。

写出时,从rootDir开始,对整棵命名树进行一次广度优先遍历,对遍历到的INode(INodeFile/INodeDirectory)依次写出到一个文件中。这个文件命名为fsImage。

fsImage是对Namespace的静态描述,在写出fsImage时,要求Namespace不可改变,而且比较耗时。

在整个系统提供连续服务的情况下,HDFS使用另一个文件记录Namespace的变化(添加/删除文件),对Namespace进行动态描述。这个文件命名为edits。

通过fsImage和edits的结合,可以即不影响服务,又能在外存记录Namespace的实时状态,避免因NameNode宕机造成元数据丢失。

BlocksMap

BlocksMap是NameNode保存block对象的容器。

所有的Block对象被封装成BlockInfo对象,BlockInfo对象组织成HashMap进行存储;

BlockInfo对象使用多个(与复本个数相同)三元组(triplets)保存每个block复本的位置信息;

三元组中第一个位元指向相应复本所在的DataNode;如图中虚线所示;

第二个位元指向相同DataNode中前一个Block;第三个位元指向相同DataNode中后一个Block;如图中实现所示,从一个DatanodeDescriptor开始,通过一个双向链表,可以找到该DataNode上所有的Block;

辅助线程

Namenode除服务主线程外,还有多个辅助线程如下:

线程名 描述
hbthread HeartbeatMonitor线程,每5秒运行一次,每5分钟检查一次节点列表,对心跳超时(10.5分种)的节点断定死亡;参见Heartbeat(心跳)
lmthread LeaseMonitor线程,每2秒检查租约是否超过hardLimit(1h);参见Lease(租约)
smmthread SafeModeMonitor线程,进入safeMode时才创建运行,每1秒钟检查一次是否可以离开,离开safeMode后线程结束;参见safeMode(安全模式)
replthread Replication线程,每3秒钟为Datanode分配replication任务,维护neededReplications和pendingReplications;参见Replication(复制)
nnrmthread NamenodeResourceMonitor线程,每5秒运行一次,检查磁盘空间不足的情况下使NN进入safemode;参见NameNodeResourceMonitor
pendingReplications.timerThread PendingReplicationBlocks线程,每5分钟将pendingReplications中的超时操作移到timedOutItems,见Replication(复制)
dnthread DecommissionManager线程,默认每30秒最多检查5个节点的Decommission状态;参见Decommission(退役)
httpServer  

Hadoop学习笔记之二:NameNode的更多相关文章

  1. hadoop学习笔记(二):简单启动

    一.hadoop组件依赖关系 二.hadoop日志格式: 两种日志,分别以out和log结尾: 1 以log结尾的日志:通过log4j日志记录格式进行记录的日志,采用日常滚动文件后缀策略来命名日志文件 ...

  2. C# Hadoop学习笔记(二)—架构原理

    一,架构   二.名词解释 (一)NameNode(简称NN),Hadoop的主节点,负责侦听节点是否活跃,对外开放接口等.在未来的大数据处理过程中,由于访问量和节点数量的不断增多,需要该节点的处理能 ...

  3. hadoop学习笔记(二):centos7三节点安装hadoop2.7.0

    环境win7+vamvare10+centos7 一.新建三台centos7 64位的虚拟机 master node1 node2 二.关闭三台虚拟机的防火墙,在每台虚拟机里面执行: systemct ...

  4. Hadoop学习笔记(二):简单操作

    1. 启动namenode和datanode,在master上输入命令hdsf dfsadmin -report查看整个集群的运行情况(记得关闭防火墙) 2. 输入命令查看hadoop监听的端口,ne ...

  5. Hadoop学习笔记之二 文件操作

    HDFS分布式文件系统:优点:支持超大文件存储.流式访问.一次写入多次读取.缺点:不适应大量小文件.不适应低时延的数据访问.不适应多用户访问任意修改文件. 1.hadoop用于大数据处理,在数据量较小 ...

  6. hadoop学习笔记(二):hdfs优点和缺点

    优点 其中的10k+,指的是每一个块必须>=1M 缺点 低延迟:是指hadoop处理数据都是以分钟为单位的,而不像storm那样的是以毫秒级为单位的. 高吞吐率:是指你分布式存储的文件块的大小必 ...

  7. Hadoop 学习笔记(二) HDFS API

    4.删除HDFS上的文件 package proj; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...

  8. Hadoop学习笔记(二)——zookeeper使用和分析

    分布式架构是中心化的设计.就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.Zookeeper就是一套分布式锁管理系统,用于高可靠的维护 ...

  9. Hadoop学习笔记(二)——插件安装和使用(Hadoop Eclipse)

    1. Hadoop Eclipse @ 配置 需注意 在写Hadoop的根目录时,路径不能有空格 http://blog.sina.com.cn/s/blog_56d8111101014mlg.htm ...

随机推荐

  1. 并发编程---死锁||递归锁---信号量---Event事件---定时器

    死锁 互斥锁:Lock(),互斥锁只能acquire一次 递归锁:  RLock(),可以连续acquire多次,每acquire一次计数器+1,只有计数为0时,才能被抢到acquire # 死锁 f ...

  2. 010-java 表单方式或者base64方式上传图片,后端使用nutz的post转发图片到另一个请求

    本地上传图片 方式一.使用表单方式上传-enctype <form enctype="multipart/form-data" method="post" ...

  3. 右键菜单添加git选项

    1.jpg   2.jpg   3.jpg   4.jpg   5.jpg   6.jpg   7.jpg

  4. VGA线 1080P之伤 <中秋节篇>

    故障:通过一台笔记本,在一台高清的电视机上使用VGA线进行视频传输,分辩率最高只能显示1600*1200,为什么不是1080P? 哎,我也很郁闷,查了相关的资料~电视机是最高支持1080P分辩率的,笔 ...

  5. wxPython:事件处理一

    事件处理是wxPython程序工作的基本机制,先看几个术语: 事件(event):应该程序期间发生的事情,要求有一个响应. 事件对象(event object):代表具体一个事件,包括事件的数据属性, ...

  6. localStorage 不方便存储数组时的替代方法

    项目背景是需要将搜索历史存储到localStorage中, 需要存储id和name,每次存储时都需要在记录中多加一条,用数组push显然是比较好的方法,但localStorage不方便存储数据,于是就 ...

  7. PHP实现装饰器

    参考:https://www.cnblogs.com/onephp/p/6108940.html ●装饰器模式(Decorator),可以动态地添加修改类的功能 ●一个类提供了一项功能,如果要在修改并 ...

  8. react 写一个贪吃蛇

    示例: 全部代码如下: snake.jsx import React, { Component } from 'react'; import PropTypes from 'prop-types'; ...

  9. HttpwebRequest - 带ViewState的网页POST请求

    这是我今天下午碰到的案例,一个退订页面的post请求,请求头信息都很明确,but看看下面这个请求体,除了最后一个key是我的页面控件名称,其他的几个ViewState相关都是what呢?(ViewSt ...

  10. Hybrid设计--核心交互

    普通网页中跳转使用a标签,这里我们要对跳转进行更多的干预,所以将全站的跳转收口到框架层,用forward去实现.拒绝用a和window.location.如果我想对所有跳转做一个处理,开动画或者对跳转 ...