HDFS的运行原理

简介

HDFS 是一个能够面向大规模数据使用的,可进行扩展的文件存储与传递系统。是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失

HDFS体系架构

HDFS体系架构

如上图所示,HDFS也是按照Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。

NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
SecondaryNameNode:是一个小弟,分担大哥namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。
DataNode: Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。
热备份: b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份: b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
fsimage:元数据镜像文件(文件系统的目录树。)
edits: 元数据的操作日志(针对文件系统做的修改操作记录)
namenode内存中存储的是=fsimage+edits。

SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。


1. Namenode

Namenode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表, 接收用户的操作请求。
文件包括:
①fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
②edits:操作日志文件。
③fstime:保存最近一次checkpoint的时间
以上这些文件是保存在linux的文件系统中。通过hdfs-site.xml的dfs.namenode.name.dir属性进行设置。

2 Datanode

提供真实文件数据的存储服务。
文件块( block): 最基本的存储单位。
对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。 HDFS默认Block大小是128MB, 因此,一个256MB文件,共有256/128=2个Block.
与普通文件系统不同的是,在 HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
Replication:多复本。默认是三个。通过hdfs-site.xml的dfs.replication属性进行设置。

3. HDFS 工作原理
写操作

写操作

有一个文件FileA,100M大小。Client将FileA写入到HDFS上。
HDFS按默认配置。
HDFS分布在三个机架上Rack1,Rack2,Rack3。

  1. Client将FileA按64M分块。分成两块,block1和Block2;
  2. Client向nameNode发送写数据请求,如图蓝色虚线①——>。
  3. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②———>。

    Block1: host2,host1,host3
    Block2: host7,host8,host4

    原理:
    NameNode具有RackAware机架感知功能,这个可以配置。
    若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副> 本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
    若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机>架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。

  4. client向DataNode发送block1;发送过程是以流式写入。

流式写入过程

1>将64M的block1按64k的package划分;
2>然后将第一个package发送给host2;
3>host2接收完后,将第一个package发送给host1,同时client想host2发送第二个package;
4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。
5>以此类推,如图红线实线所示,直到将block1发送完毕。
6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。
7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线
8>发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。
9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。
10>client向NameNode发送消息,说我写完了,如图黄色粗实线。。。这样就完毕了。

分析,通过写过程,我们可以了解到:
①写1T文件,我们需要3T的存储,3T的网络流量贷款。
②在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去。读取时,要读其他节点去。
③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份。

读操作:

读操作

读操作就简单一些了,如图所示,client要从datanode上,读取FileA。而FileA由block1和block2组成。

那么,读操作流程为:

  1. client向namenode发送读请求。
  2. namenode查看Metadata信息,返回fileA的block的位置。
    block1:host2,host1,host3
    block2:host7,host8,host4
  3. block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后 block2,去host7上读取;

上面例子中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。


SecondaryNameNode,CheckpointNode、BackupNode
在Hadoop-2.x版本之前只存在SecondaryNameNode,没有CheckpointNode、BackupNode的概念,在2.x版本中引入了后两者,增强了对NameNode的同步和备份。现在就学习一下2.x版本中的SecondaryNameNode、CheckpointNode、BackupNode,在开始之前先了解一下NameNode中的两个重要文件fsimage和edits以及NameNode是如何使用这两个文件持久化命名空间的,比如HDFS文件系统的元数据。

NameNode使用fsimage和edits持久化命名空间,其中fsimage保存最新的检查点信息,edits保存自最新检查点后的命名空间的变化。当NameNode启动时,NameNode从fsimage中读取HDFS的状态,并会合并edits中信息到fsimage中以提供最新的文件系统元数据,这样fsimage中保存了HDFS的最新状态并会创建新的空的edits文件。由于fsimage和edits的合并只在NameNode启动时执行,如果NameNode长时间没有重新启动过,edits日志文件将会变得非常大,另一个edits日志文件太大的副作用时下次NameNode的重启将会花费更多的时间,因为需要更多的时间合并fsimage和edits文件。

由上面的描述可知fsimage和edits文件对整个HDFS有着至关重要的作用,一旦NameNode失效,比如宕机无法启动或者硬盘损坏,就将导致由于失去fsimage和edits文件而无法启动HDFS的现象,所以就出现了SecondaryNameNode、CheckpointNode、BackupNode用于对fsimage和edits文件备份,SecondaryNameNode是最先存在的,后两者是在2.x版本引入的。
SecondaryNameNode定期性地合并fsimage和edits文件,并保证edits日志文件大小不超过某个阈值。SecondaryNameNode与NameNode运行在不同的主机上,并且内存要与NameNode的内存一样大小。SecondaryNameNode将包含最新检查点信息的fsimage存储在与NameNode目录结构一致的目录中,这样SecondaryNameNode的fsimage总是在必要时可以被NameNode读取。SecondaryNameNode上检查点进程的启动被下面两个参数控制:
dfs.namenode.checkpoint.period,指定了两次连续的检查点之间的最大间隔,默认值为3600秒,即1小时
dfs.namenode.checkpoint.txns,定义了NameNode上未检查的事务的数量,当NameNode上未检查的事务的数量达到该值时,将会启动紧急检查点而不管dfs.namenode.checkpoint.period设置的时间间隔是否有效,默认值为1000000。

BackupNode不仅提供了与CheckpointNode相同的检查点功能,而且在内存中维护了文件系统命名空间的最新拷贝,该拷贝与NameNode中的状态总是同步的。除了从NameNode接收edits文件流外,BackupNode将这些edits文件在内存中创建副本,这样就创建了命名空间的备份。BackupNode不需要从NameNode下载fsimage和edits文件以创建检查点(CheckpointNode和SecondaryNameNode需要从NameNode下载这些文件),因为BackupNode已经在内存中最新的命名空间状态。BackupNode的检查点更加高效,因为它只需要将命名空间保存到本地fsimage文件中并重置edits文件。BackupNode的内存大小与NameNode的一样。

参考: http://www.cnblogs.com/laov/p/3434917.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值