HDFS工作原理

来源:互联网 发布:win10手写笔记软件 编辑:程序博客网 时间:2024/06/04 17:42

HDFS工作原理

一、 概述
1、HDFS集群分为两大角色:NameNode、DataNode
2、NameNode负责管理整个文件系统的元数据
3、DataNode负责管理用户的文件数据块
4、文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干平台的datanode上
5、每一个文件块可以有多个副本,并存放在不同的datanode上
6、DataNode会定期向NameNode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
7、HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行的。

二、 HDFS写数据流程

1、概述
客户端要向HDFS写数据,首先要跟namenode通信,确认可以写文件并获取接收文件块的datanode。然后,客户端按顺序将文件逐个块(block)传递给响应的datanode,并由接受到block的datanode负责向其他datanode复制块的副本。

2、写数据的详细步骤
图1.HDFS写数据过程

a、和NameNode通信请求要上传文件,NameNode收到请求后检查目标文件是否已经存在,父目录是否存在b、NameNode返回信息告知客户端是否可以上传文件c、如果可以上传,client会向NameNode请求第一个文件块(block)128M该传输给哪个DataNode服务器d、NameNode返回3个可用DataNode服务器A、B、Ce、客户端client会请求3台DataNode中一台假设为A,进行上传数据(本质上一个RPC调用,简历popeline),A收到请求后会继续调用B,然后B调用C,将整个pipeline建立完成,逐级返回客户端f、客户端Client开始往DataNodeA以packet(64K)为单位上传第一个文件块(Block)(先从磁盘读取数据放到一个本地内存缓存)。当A收到一个packet就会传递给B,B会传给C;A每传一个packet会放入一个应答队列等待应答。g、当一个文件块传输完成之后,客户端client再次请求namenode上传第二个文件块的服务器。

三、 HDFS读数据流程

1、 概述
客户端将要读取的文件路径发送给NameNode,NameNode获取文件的元数据(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应的DataNode,逐个获取文件的块信息并在客户端本地进行数据追加合并从而获得整个文件。

2、读数据的详细步骤
图2.HDFS读数据过程

a、  客户端和NameNode通信查询元数据,找到文件块所在的DataNode服务器b、  挑选一台DataNode服务器(就近原则,然后随机),请求简历socket流。c、  DataNode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)d、  客户端以packet为单位接收,先在本地进行缓存,然后写入目标文件。

四、 NameNode工作机制

1、 NameNode职责
负责客户端的请求
负责元数据的管理
负责维护目录树
2、 元数据存储机制

a)内存中有一份完整的元数据(内存meta data)b)磁盘有一个“准完整”的元数据镜像(fsimage)文件,该文件在NameNode的工作目录中c)用于衔接内存元数据和持久化元数据镜像fsimage之间的操作日志:edits文件当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存元数据中。

3、 元数据查看
通过hdfs的工具查看
hdfs oev –I 日志文件 -o 输出路径及文件名
hdfs oiv –I fsimage_000000000xxx –p XML –o fsimage.xml
4、 元数据的checkpoit
每隔一段时间,会由secondary namenode将namenode上积累的所有的edits和一个最新的fsimage下载到本地,并加载到内容进行merger,整个过程称为checkpoint

a、客户端更新元数据(更改文件名称、路径、删除文件、增删改操作),NameNode会将操作日志记录到edits中。b、Secondary NameNode会定期的去请求NameNode是否需要CheckPoint。c、如果需要,namenode会滚动当前的日志edits.inprogess,将当前的edits和NameNode中的fsimage下载到SN中。d、SN将edits和fsimage加载到内存进行合并,dump成新的fsimage镜像文件,并重新上传到namenode中,重新命名为新的fsimagee、需要注意的是,checkpoint时,会把正在写的edits滚动一下,然后将fsimage和日志下载SN机器上,只有第一次才下载fsimage,这是的文件操作没有那么大的数据量,以后只负责下载日志文件,合并旧的fsimage。

Checkpoint的附带作用
NameNode工作时的元数据使用的是内存元数据,并不会查找fsimage和edits,这两个数据主要用来持久化,如果nameNode宕机,内存中没有元数据,hdfs重新启动的时候,数据就会冲fsimage和edits中加载。
namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据。

Checkpoint的触发条件:

a、设置默认时间b、edits中记录数dfs.namenode.checkpoint.check.period=60  #检查触发条件是否满足的频率,60秒dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary

以上两个参数做checkpoint操作时,secondary namenode的本地工作目录

dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}dfs.namenode.checkpoint.max-retries=3  #最大重试次数dfs.namenode.checkpoint.period=3600  #两次checkpoint之间的时间间隔3600秒dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

5、 元数据的目录结构
部署集群后,需要在NameNode节点格式化磁盘

hdfs namenode -format

格式化后,将会在$dfs.namenode.name.dir/current目录下的文件结构

current/|-- VERSION|-- edits_*|-- fsimage_0000000000008547077|-- fsimage_0000000000008547077.md5`-- seen_txid

其中dfs.name.dir是在hdfs-site.xml文件中配置的,默认配置如下:

<property>  <name>dfs.name.dir</name>  <value>file://${hadoop.tmp.dir}/dfs/name</value></property>

hadoop.tmp.dir是在core-site.xml中配置的,默认值如下

<property>  <name>hadoop.tmp.dir</name>  <value>/tmp/hadoop-${user.name}</value>  <description>A base for other temporary directories.</description></property>

dfs.namenode.name.dir属性可以配置多个目录,
如/data1/dfs/name,/data2/dfs/name,/data3/dfs/name,….。各个目录存储的文件结构和内容都完全一样,相当于备份,这样做的好处是当其中一个目录损坏了,也不会影响到Hadoop的元数据,特别是当其中一个目录是NFS(网络文件系统Network File System,NFS)之上,即使你这台机器损坏了,元数据也得到保存。
下面对$dfs.namenode.name.dir/current/目录下的文件进行解释。

五、 DataNode工作原理

1、 DataNode职责
管理存储文件块数据
定期向NameNode会标自身所持有的block信息(通过心跳信息上报)

<property>    <name>dfs.blockreport.intervalMsec</name>    <value>3600000</value>    <description>Determines block reporting interval in milliseconds.</description></property>

2、 DataNode掉线
DataNode进程死亡或者网络故障噪声dataNode无法与NameNode通信,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间可称为超时时长。HDFS默认的超时时长为10分钟30秒。超时时间为timeout,则超时时长计算公式为:
timeout = 2*heartbeat.recheck.interval+10*dfs.heartbeat.interval
默认heartbeat.recheck.interval大小为5分钟,dfs.heartbeat.interval默认为3秒
hdfs-site.xml中heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval单位为秒。

<property>        <name>heartbeat.recheck.interval</name>        <value>2000</value></property><property>        <name>dfs.heartbeat.interval</name>        <value>1</value></property>
原创粉丝点击