Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。它能提供高吞吐量的数据访问,很是适合大规模数据集上的应用。要理解HDFS的内部工做原理,首先要理解什么是分布式文件系统。html
多台计算机联网协同工做(有时也称为一个集群)就像单台系统同样解决某种问题,这样的系统咱们称之为分布式系统。node
分布式文件系统是分布式系统的一个子集,它们解决的问题就是数据存储。服务器
换句话说,它们是横跨在多台计算机上的存储系统。存储在分布式文件系统上的数据自动分布在不一样的节点上。网络
分布式文件系统在大数据时代有着普遍的应用前景,它们为存储和处理来自网络和其它地方的超大规模数据提供所需的扩展能力。分布式
存储到文件系统中的每一个文件都有相关联的元数据。元数据包括了文件名、i 节点(inode )数、数据块位置等,而数据则是文件的实际内容。oop
在传统的文件系统里,由于文件系统不会跨越多台机器,元数据和数据存储在同一台机器上。大数据
为了构建一个分布式文件系统,让客户端在这种系统中使用简单,而且不须要知道其余客户端的活动,那么元数据须要在客户端之外维护。HDFS的设计理念是拿出一台或多台机器来保存元数据,并让剩下的机器来保存文件的内容。设计
NameNode和DataNode是HDFS的两个主要组件。其中,元数据存储在NameNode上,而数据存储在DataNode的集群上。NameNode不只要管理存储在HDFS上内容的元数据,并且要记录一些事情,好比哪些节点是集群的一部分,某个文件有几份副本等。它还要决定当集群的节点宕机或者数据副本丢失的时候系统须要作什么。htm
存储在HDFS上的每份数据片有多份副本(replica )保存在不一样的服务器上。blog
在本质上,NameNode是HDFS的Master(主服务器),DataNode是Slave (从服务器)。
NameNode负责管理存储在HDFS上全部文件的元数据,它会确认客户端的请求,并记录下文件的名字和存储这个文件的DataNode集合。它把该信息存储在内存中的文件分配表里。
例如,客户端发送一个请求给NameNode,说它要将“zhou.log”文件写入到HDFS. 那么,其执行流程如图1 所示。具体为:
Hadoop图1 HDFS写过程示意图
在分布式文件系统的设计中,挑战之一是如何确保数据的一致性。对于HDFS来讲,直到全部要保存数据的DataNodes 确认它们都有文件的副本时,数据才被认为写入完成。所以,数据一致性是在写的阶段完成的。一个客户端不管选择从哪一个DataNode读取,都将获得相同的数据。
为了理解读的过程,能够认为一个文件是由存储在DataNode上的数据块组成的。客户端查看以前写入的内容的执行流程如图2 所示,具体步骤为:
图2 HDFS读过程示意图
客户端并行从不一样的DataNode中获取一个文件的数据块,而后联结这些数据块,拼成完整的文件。
当一切运行正常时,DataNode会周期性发送心跳信息给NameNode(默认是每3 秒钟一次)。若是NameNode在预约的时间内没有收到心跳信息(默认是10分钟),它会认为DataNode出问题了,把它从集群中移除,而且启动一个进程去恢复数据。
DataNode可能由于多种缘由脱离集群,如硬件故障、主板故障、电源老化和网络故障等。
对于HDFS来讲,丢失一个DataNode意味着丢失了存储在它的硬盘上的数据块的副本。假如在任意时间总有超过一个副本存在(默认3 个),故障将不会致使数据丢失。当一个硬盘故障时,HDFS会检测到存储在该硬盘的数据块的副本数量低于要求,而后主动建立须要的副本,以达到满副本数状态。
在HDFS里,文件被切分红数据块,一般每一个数据块64MB~128MB,而后每一个数据块被写入文件系统。同一个文件的不一样数据块不必定保存在相同的DataNode上。
这样作的好处是,当对这些文件执行运算时,可以经过并行方式读取和处理文件的不一样部分。
当客户端准备写文件到HDFS并询问NameNode应该把文件写到哪里时,NameNode会告诉客户端,那些能够写入数据块的DataNode. 写完一批数据块后,客户端会回到NameNode获取新的DataNode列表,把下一批数据块写到新列表中的DataNode上。