随着数据量愈来愈大,在一个操做系统管辖的范围内存不下了,那么就分配到更多的操做系统管理的磁盘中,可是不方便管理和维护,迫切须要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS
只是分布式文件管理系统中的一种。node
HDFS
,它是一个文件系统,用于存储文件,经过目录树来定位文件;其次,它是分布式的,由不少服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS
的设计适合一次写入,屡次读出的场景,且不支持文件的修改。适合用来作数据分析,并不适合用来作网盘应用。缓存
这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。
下面咱们分别介绍这四个组成部分。
复制代码
HDFS
的时候,Client将文件切分红一个一个的Block
,而后进行存储。NameNode
交互,获取文件的位置信息。DataNode
交互,读取或者写入数据。HDFS
,好比启动或者关闭HDFS。HDFS
。就是master,它是一个主管、管理者
复制代码
HDFS
的名称空间。Block
映射信息就是Slave,NameNode下达命令,DataNode执行实际的操做
复制代码
并不是NameNode的热备,当NameNode挂掉的时候,它并不能立刻替换NameNode并提供服务
复制代码
NameNode
,分担其工做量。Fsimage
和Edits
,并推送给NameNode
。NameNode
。HDFS中的文件在物理上是分块存储(block),块的大小能够经过配置参数( dfs.blocksize)来规定,
默认大小在hadoop2.x版本中是128M,老版本中是64M。
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。若是块设置得足够大,从磁盘传输数据的时间会明显大于定位
这个块开始位置所需的时间,于是,传输一个由多个块组成的文件的时间取决于磁盘传输速率。
若是寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,
咱们要将块大小设置约为100MB。默认的块大小128MB。块的大小:10ms*100*100M/s = 100M
复制代码
Distributed FileSystem
模块向namenode
请求上传文件,namenode
检查目标文件是否已存在,父目录是否存在。namenode
返回是否能够上传。block
上传到哪几个datanode
服务器上。namenode
返回3个datanode
节点,分别为dn一、dn二、dn3
。FSDataOutputStream
模块请求dn1
上传数据,dn1
收到请求会继续调用dn2
,而后dn2
调用dn3
,将这个通讯管道创建完成。dn1
、dn2
、dn3
逐级应答客户端。dn1
上传第一个block
(先从磁盘读取数据放到一个本地内存缓存),以packet
为单位,dn1
收到一个packe
t就会传给dn2
,dn2
传给dn3
;dn1
每传一个packet
会放入一个应答队列等待应答。block
传输完成以后,客户端再次请求namenode
上传第二个block
的服务器。(重复执行3-7步)Distributed FileSystem
向namenode
请求下载文件,namenode
经过查询元数据,找到文件块所在的datanode
地址。datanode
(就近原则,而后随机)服务器,请求读取数据。datanode
开始传输数据给客户端(从磁盘里面读取数据输入流,以packet
为单位来作校验)。packet
为单位接收,先在本地缓存,而后写入目标文件。namenode
格式化后,建立fsimage
和edits
文件。若是不是第一次启动,直接加载编辑日志和镜像文件到内存。namenode
记录操做日志,更新滚动日志。namenode
在内存中对数据进行增删改查。Secondary NameNode
询问namenode
是否须要checkpoint
。直接带回namenode
是否检查结果。Secondary NameNode
请求执行checkpoint
。namenode
滚动正在写的edits
日志。Secondary NameNode
。Secondary NameNode
加载编辑日志和镜像文件到内存,并合并。fsimage.chkpoint
。fsimage.chkpoint
到namenode
。namenode
将fsimage.chkpoint
从新命名成fsimage
。namenode
被格式化以后,将在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current
目录中产生以下文件:安全
edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
复制代码
Fsimage
文件:HDFS
文件系统元数据的一个永久性的检查点,其中包含HDFS
文件系统的全部目录和文件idnode
的序列化信息。Edits
文件:存放HDFS
文件系统的全部更新操做的路径,文件系统客户端执行的全部写操做首先会被记录到edits
文件中。seen_txid
文件保存的是一个数字,就是最后一个edits_
的数字Namenode
启动的时候都会将fsimage
文件读入内存,并从00001
开始到seen_txid
中记录的数字依次执行每一个dits
里面的更新操做,保证内存中的元数据信息是最新的、同步的,能够当作Namenode
启动的时候就将fsimage
和edits
文件进行了合并。datanode
上以文件形式存储在磁盘上,包括两个文件,一个是数据自己,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode
启动后向namenode
注册,经过后,周期性(1小时)的向namenode
上报全部的块信息。namenode
给该datanode
的命令如复制块数据到另外一台机器,或删除某个数据块。若是超过10分钟没有收到某个datanode
的心跳,则认为该节点不可用。