Hadoop学习:深度剖析HDFS原理(2)

Secondary NameNode:小弟角色,分担大哥namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode, 注意:在hadoop 2.x 版本,当启用 hdfs ha 时,将没有这一角色。(详见第二单)

解释说明:

热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作

冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失

hdfs构架原则:

元数据与数据分离:文件本身的属性(即元数据)与文件所持有的数据分离

主/从架构:一个HDFS集群是由一个NameNode和一定数目的DataNode组成

一次写入多次读取:HDFS中的文件在任何时间只能有一个Writer。当文件被创建,接着写入数据,最后,一旦文件被关闭,就不能再修改。

移动计算比移动数据更划算:数据运算,越靠近数据,执行运算的性能就越好,由于hdfs数据分布在不同机器上,要让网络的消耗最低,并提高系统的吞吐量,最佳方式是将运算的执行移到离它要处理的数据更近的地方,而不是移动数据

NameNode:

NameNode是整个文件系统的管理节点,也是HDFS中最复杂的一个实体,它维护着HDFS文件系统中最重要的两个关系:

HDFS文件系统中的文件目录树,以及文件的数据块索引,即每个文件对应的数据块列表

数据块和数据节点的对应关系,即某一块数据块保存在哪些数据节点的信息

-i  (必填参数)  –inputFile <arg>  输入FSImage文件

-o (必填参数)  –outputFile <arg> 输出转换后的文件,如果存在,则会覆盖

-p (可选参数) –processor <arg>  将FSImage文件转换成哪种格式: (Ls|XML|FileDistribution).默认为Ls

示例:hdfs oiv -i /data1/hadoop/dfs/name/current/fsimage_0000000000019372521 -o /home/hadoop/fsimage.txt

命令:hdfs oev (offline edits viewer 离线edits查看器)的缩写, 该工具只操作文件因而并不需要hadoop集群处于运行状态。

示例:  hdfs oev -i edits_0000000000000042778-0000000000000042779 -o edits.xml

支持的输出格式有binary(hadoop使用的二进制格式)、xml(在不使用参数p时的默认输出格式)和stats(输出edits文件的统计信息)

小结:

NameNode管理着DataNode,接收DataNode的注册、心跳、数据块提交等信息的上报,并且在心跳中发送数据块复制、删除、恢复等指令;同时,NameNode还为客户端对文件系统目录树的操作和对文件数据读写、对HDFS系统进行管理提供支持

Namenode 启动后会进入一个称为安全模式的特殊状态。处于安全模式 的 Namenode 是不会进行数据块的复制的。 Namenode 从所有的 Datanode 接收心跳信号和块状态报告。块状态报告包括了某个 Datanode 所有的数据 块列表。每个数据块都有一个指定的最小副本数。当 Namenode 检测确认某 个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全 (safely replicated) 的;在一定百分比(这个参数可配置)的数据块被 Namenode 检测确认是安全之后(加上一个额外的 30 秒等待时间), Namenode 将退出安全模式状态。接下来它会确定还有哪些数据块的副本没 有达到指定数目,并将这些数据块复制到其他 Datanode 上。

Secondary NameNode:在HA cluster中又称为standby node

定期合并 fsimage 和 edits 日志,将 edits 日志文件大小控制在一个限度下

Hadoop学习:深度剖析HDFS原理

namenode 响应 Secondary namenode 请求,将 edit log 推送给 Secondary namenode , 开始重新写一个新的 edit log

Secondary namenode 收到来自 namenode 的 fsimage 文件和 edit log

Secondary namenode 将 fsimage 加载到内存,应用 edit log , 并生成一 个新的 fsimage 文件

Secondary namenode 将新的 fsimage 推送给 Namenode

Namenode 用新的 fsimage 取代旧的 fsimage , 在 fstime 文件中记下检查 点发生的时

 HDFS写文件:

Client将FileA按64M分块。分成两块,block1和Block2;

Client向nameNode发送写数据请求,如图蓝色虚线①------>

NameNode节点,记录block信息。并返回可用的DataNode (NameNode按什么规则返回DataNode? 参见第三单 hadoop机架感知),如粉色虚线②--------->

Block1: host2,host1,host3

Block2: host7,host8,host4

client向DataNode发送block1;发送过程是以流式写入,流式写入过程如下:

将64M的block1按64k的packet划分

然后将第一个packet发送给host2

host2接收完后,将第一个packet发送给host1,同时client想host2发送第二个packet

host1接收完第一个packet后,发送给host3,同时接收host2发来的第二个packet

以此类推,如图红线实线所示,直到将block1发送完毕

host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示

client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线

发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示

 说明:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c3eab9a913b95d0287da5ef5224fc640.html