初识Hadoop之HDFS

来源:互联网 发布:声音编辑软件 编辑:程序博客网 时间:2024/05/23 02:07

初识Hadoop之HDFS

HDFS—Hadoop Distributed FileSystem :HDFS以前的名字是叫NDFS,即Nutch分布式文件系统,主要谈谈它的原理,这里就引用网上的的一些资料,自己经过理解后整理的一些漫画图。讲解原理之前,先来看看在集群中的一系列后台程序。它们分别是Namenode、Datanode、Scondary Namenode,

Namenode

这里写图片描述

Namenode 管理着文件系统的Namespace。它维护着文件系统树以及文件树中所有的文件和文件夹的元数据。管理这些信息的文件有两个,分别是Namespace 镜像文件和操作日志文件,这些信息被缓存在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。从图中可以看出,namenode是不直接参与文件信息的读取与写入的,namenode只是给Client提供整个文件系统树,按照一定的算法给它分配它所需要的datanode,然后Client直接和Datanode交互。

Datanode

Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。
集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作。

Secondary NameNode

Secondary NameNode是一个用来监控HDFS状态的辅助后台程序。就像NameNode一样,每个集群都有一个Secondary NameNode,并且部署在一个单独的服务器上。Secondary NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的 快照。由于NameNode是单点的,通过Secondary NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。

知道了各个节点最基本的介绍后,那么下面就通过一组漫画来深入理解HDFS

一:系统中的三大部分

这里写图片描述

从图中可以知道的是
Client:用户通过与namenode和datanode交互来访问整个文件系统
NAMENODE:整个文件系统中只存在一个namenode 并且协调整个系统的运作,所以说如果在整个系统中,如果namenode死掉,那么相当于整个文件系统报废,所有的数据将会丢失,因为所有数据的地址信息都存储在namenode上,所以namenode的存在相当重要,后面会提到namenode的容错机制。
DATANODE:文件系统上的工作节点,负责存储数据。

二:数据的存储过程

这里写图片描述

Block:HDFS上的文件被划分为块大小的多个分块,作为独立的存储单元。
BlockSize:block的大小通常被设置为64M/128M。
Replication Factory:HDFS中存储数据,一般会默认存储3个副本。

问题:为什么block的大小不设置小于64M或是大于128M呢
这要从几个方面来看,首先看看为什么不小于64M。首先是为了减少寻道时间,HDFS的设计前提是对大容量的流式数据操作,所以即使是一般的读写操作,涉及到的数据量都是很庞大的。如果block大小设置过小,那么就会产生很多的block,那么需要读取的数据块就会比较多,数据块在硬盘上非连续存储,普通硬盘因为需要移动磁头,所以随机寻址会比较慢,读越多的数据块就增大了总的硬盘寻道时间。当硬盘寻道时间比IO时间还要长的多时,那么寻道时间就成了系统的瓶颈,合适的块大小有助于减少硬盘的寻道时间,提高系统吞吐量。
其次是为了减少namenode内存消耗:一个HDFS中只有一个namenode节点,他的内存相对于datanode来说是有限的,namenode需要在其内存中向FSimge中记录Datanode中的数据块信息,加入数据块大小设置过小,那么需要维护的数据块就会越多,那么Namenode的内存就可能伤不起了。那么为什么不能远大于128M呢?从namenode的原理上来看,namenode将文件系统树及整棵树内所有的文件和目录以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。Namenode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的信息,因为这些信息会在系统启动时由数据节点重建。
重要的是最后一点,数据块越大,数据加载时间越长,系统恢复过程越长,所以块大小不宜太大。最后一点Mapreduce中的map任务通常一次只处理一个block中的数据,因此如果任务数太少(少于集群中的节点数),作业的运行速度就会比较慢。

这里写图片描述

Client通知Namenode需要向系统中写入数据并告知其数据块大小与备份个数
这里写图片描述这里写图片描述

首先,namenode会通过算法去寻找3个(前面提到的告知namenode所需的备份个数)最近的datanode节点地址并将它们发送给Client。Client得到datanode地址后,会将数据发送给第一个datanode,第一个datanode将数据存储在硬盘上,当它存储完后它会将相同的数据传递给第二个数据,第二个数据存储完后又会将数据传递给最后一个datanode节点。
当所有数据都存储完毕后,datanode会告知namenode任务完成。
这里写图片描述
当Client知道数据成功存储完毕后,会告知namenode关闭文件系统。此时namenode会将所有的元信息持久的存储在硬盘上。整个过程的概述:Client将文件信息划分在block上,namenode将datanode的地址提供给Client。Datanode通过复制管道存储数据。

三:数据的读取过程

这里写图片描述

当用户需要读取数据时。首先会告知Client我需要读取数据了,Client此时会通知namenode,namenode就会返回一个存储着datanode地址信息的表给Client(DataNode按照与Client的距离来排序)。
这里写图片描述
当Client收到记录着datanode位置信息的列表后,Client就可以从表中得知自己需下载哪些block并且可以知道这些block被存储在哪个datanode上,然后Client就根据datanode地址找到对应的datanode,告知其所需要下载的block,datanode就会返回block给Client,至此完成数据的读取。 当然,万事不能皆顺利,那么问题1:当datanode死亡的时候会发生什么? 问题2:datanode中block并没有所需要的数据时(即可能block存储数据时就失败了)怎么办?问题3:就算找到了所需下载的block,那么如果其中的数据时损坏的那么怎么办?

就下来就让我们看看容错机制:

四:容错,第一部分:故障类型及其检测方法(nodeserver 故障,和网络故障,和脏数据问题)

这里写图片描述
通常会发生这3种类型的故障:节点故障、网络故障、数据的损坏(有可能在通过网络发送的时候就损坏或者存储在硬盘上时损坏)

4.1:NODE FAILURES

这里写图片描述
Namenode故障::如果namenode故障,那么相当于整个集群都死掉了,namenode是单点故障
Datanode故障:namenode和datanode之间会通过心跳来确定datanode是否存活,每隔3秒datanode就会向namenode发送一个心跳,意味着告知namenode我还活着。如果10分钟之内namenode都没收到datanode发来的信息,那么DataNode就会被判定未死亡,尽管datanode或许是存活的,而是其他通信等原因造成的,但namenode对此一律采用心跳机制。

4.2:NETWORK FAILURES

这里写图片描述
网络故障:当Client向datanode发送数据时,如果Datanode收到了数据,那么datanode会返还一个ACK给Client告知其成功收到data。如果几次重试之后Client都没有收到ACK,那么Client就会假定接收方死亡或者网络通信出现故障。

4.3:脏数据

这里写图片描述

当Client向datanode传输数据时会连带传输一个校验码,datanode在硬盘上储存数据时会连带校验码一起储存。 Datanode会定期的将BLOCKREPORT(块信息)发给namenode。
这里写图片描述
Datanode在发送快信息给namenode之前,它会检查校验码是否正确,datanide不会把损坏了的blocks发送给namenode。

五:容错第二部分,读写容错

这里写图片描述

Client有自己的一套容错机制,Client将以包为单位(通常大小为64K)发送data给datanode,它规定如果datanode成功接收了数据,那么datanode要返回一个ACK给Client以表示自己成功接收导论数据。所以,如果Client没有接收到正在接收数据的datanode返回的ACK,那么Client就会调整整个传输管道,选择性的跳过被认为死亡的datanode。
这里写图片描述
当Client向namenode索要block的地址时,namenode会将所有的datanode的地址发给Client,所以当Client发现某个datanode坏死时,Client可以选择跳过此datanode,并且选择通过地址选择下一个datanode

六:容错第三部分,datanode失效

这里写图片描述
前面说到,namenode以两个文件形式管理着整个文件系统,分别是命名空间镜像文件和编辑日志文件。那么命名空间镜像文件就包括:Block列表和Datanode列表。Blocks列表上面记录着block存储在哪个datanode上,Datanode列表上记录着某个datanode所包含的blocks。Namenode会连续刷新这两个表,如果namenode发现其中某个block损坏,那么namenode会刷新Blocks列表,将损坏的blocks所寄存的Datanode从blocks列表中移除。如果namenode发现某个datanode损坏,那么namenode会刷新两个表(blocks list and datanodes list),将两个表中有关于这个损坏的datanode的信息全部移除。

UNDER REPLICATED BLOCKS:namenode定期首先扫描blocks列表,寻找没有正确复制的blocks。这些blocks就称做 “under relicated” blocks,
这里写图片描述
对于所有的 under-replicated blocks来说,namenode会把任务分配给其他的DataNode来做。那么对于所有的工作来说,是否需要至少一个有效的副本?这是肯定的,HDFS不能保证最后一个副本总是能够存活,这点在下面来做解释。

七:备份规则

这里写图片描述
那么namenode是如何去选择datanode来保存blocks的呢?第一个副本位置最简单,如果写数据的用户就是本集群的一员,那么第一个副本的位置就选择用户所在rock,否则就选择一些随机的datanode。
这里写图片描述
那么剩下的两个副本该如何选择呢?挑选一个不同于第一个副本所在的机架,在此机架上选择两个不同的datanode。
随后的副本定位:挑选一些随机的datanode,如果他们满足这两个条件:每个datanode只有一个副本,机架上最多两个副本

至此,以上就是我刚学hadfs所搜集到的一些资料与自己的一些理解,学习东西总喜欢去看它的原理,而网上的许多图片又可以生动形象的表达。当然,网上有中文的漫画hdfs过程,自己去翻译了一遍,也算是补补英语。 有什么地方不对还请大家指出。

0 0