HDFS上传下载原理
一、HDFS数据流向模型(上传和下载)
1>网络拓扑结构和机架感知
1. 网络拓扑
节点距离:两个节点到达共同父节点的距离和
2. 机架感知 ( 副本节点的选择 )
例如:500个节点,上传数据jdk.tar.gz ,设定副本数为3,
根据机架感知,副本数据存储节点的选择。
<2>上传操作数据流向模型
1. client向namenode发送上传请求(将本地e:/myfile.txt上传到HDFS)
2. NameNode返回上传请求结果
3. clinet接受到可以传递的结果,继续请求NameNode具体上传的数据节点信息
4. NameNode返回备份数据的节点信息给client
5. client可所有的数据节点建立连接,并传递数据
6. client返回上传完毕结果给NameNode
<3>下载操作数据流向模型
1. client向namenode发送下载请求(下载/home/zhangsan/myfile.txt)
2. namenode将当前数据的元数据返回给client(client需要下载的数据的信息,数据存储在哪个节点)
3. 就近选择一台数据节点
4. client向数据节点发送下载请求
5. 数据节点返回下载许可
6. 以package数据包下载数据,先在client缓冲,然后持久化磁盘
二、NameNode和StandbyNameNode的工作流程(重点)
<1>NameNode的工作流程/StandbyNameNode的工作流程
- SNN检查是否达到checkpoint条件:离上一次checkpoint操作是否已经有一个小时,或者HDFS已经进行了100万次操作。
- SNN检查达到checkpoint条件后,将该namespace以fsimage.ckpt_txid格式保存到SNN的磁盘上,并且随之生成一个MD5文件。然后将该fsimage.ckpt_txid文件重命名为fsimage_txid
- 然后SNN通过HTTP联系ANN。
- . ANN通过HTTP从SNN获取最新的fsimage_txid文件并保存为fsimage.ckpt_txid,然后也生成一个MD5,将这个MD5与SNN的MD5文件进行比较,确认ANN已经正确获取到了SNN最新的fsimage文件。然后将fsimage.ckpt_txid文件重命名为fsimage_txit。
通过上面一系列的操作,SNN上最新的FSImage文件就成功同步到了ANN上。
<2>fsimage镜像文件和edits编辑日志
fsimage镜像文件:存储HDFS中最新的文件信息,元数据,所有文件和目录信息
edits编辑日志: 用户的操作
查看:fsimage镜像文件和edits编辑日志
命令1:查看镜像文件
hdfs oiv -p 文件的类型 -i 镜像文件 -o 转换后文件的路径
例如:hdfs oiv -p XML -i fsimage00024235 -o /home/zhangsan/fs1.xml
命令2:查看编辑日志
hdfs oev -p 文件的类型 -i 镜像文件 -o 转换后文件的路径
例如:hdfs oiv -p XML -i edits00024235 -o /home/zhangsan/edits1.xml
案例:
清空数据,格式名称节点
<3>编辑日志的滚动操作
有新的用户操作和数据时编辑日志滚动
实现编辑日志的手动:hdfs dfsadmin -rollEdits
<4>checkpoint
checkpoint 概念
NameNode的metadata信息在启动后会加载到内存,由于加载到内存的数据很不安全,断电后就没有了,因此必须对内存中存放的信息做持久化处理。
Namenode上保存着HDFS的命名空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为Edits的事务日志记录下来。例如,在HDFS中创建一个文件,Namenode就会在Edits中插入一条记录来表示;同样地,修改文件的副本系数也将往Edits插入一条记录。Namenode在本地操作系统的文件系统中存储这个Edits。整个文件系统的命名空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。
Namenode在内存中保存着整个文件系统的命名空间和文件数据块映射(Blockmap)的映像。当Namenode启动时,它从硬盘中读取Edits和FsImage,将所有Edits中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Edits,因为这个旧的Edits的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。
checkpoint 过程
在HA模式下checkpoint过程由StandBy NameNode来进行,以下简称为SNN,Active NameNode简称为ANN。
HA模式下的edit.log文件会同时写入多个JournalNodes节点的dfs.journalnode.edits.dir路径下,JournalNodes的个数为大于1的奇数(至少为3),类似于Zookeeper的节点数,当有不超过一半的JournalNodes出现故障时,仍然能保证集群的稳定运行。
SNN会读取FSImage文件中的内容,并且每隔一段时间就会把ANN写入edit log中的记录读取出来,这样SNN的NameNode进程中一直保持着hdfs文件系统的最新状况namespace。当达到checkpoint条件的某一个时,就会直接将该信息写入一个新的FSImage文件中,然后通过HTTP传输给ANN。
checkpoint 设置
默认情况下,2NN 一小时执行一次
设置时间点:hdfs-default.xml 查看 , hdfs-site.xml中设置
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
</property>
辅助名称节点的web UI访问地址:
ip地址:50090
<5>名称节点故障,数据恢复
5.1 指定多个名称节点存储路径
1. 停止进程
2. 配置文件:hdfs-default.xml 查看 , hdfs-site.xml中设置
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
3. 删除原数据(${hadoop_dir_name}/* hadoop/logs/* )
4. 格式化文件系统
hadoop namenode -format
5. 查看多个名称节点的存储目录 (实时同步,数据是一致)
5.2 名称节点数据的恢复 (edits_inprogress数据会丢失)
0. 模拟名称节点异常
jsp 查询namenode的pid
kill -9 pid
rm -rf /home/zhangsan/hadoop/dfs/current/name/*
1. 将scondarynamenode中存储的元数据远程拷贝到namenode
scp -r zhangsan@s201:/home/zhangsan/hadoop/dfs/namesecondary/* ./name/
2. 启动namenode
hadoop-daemon.sh namenode
三、DataNode的工作流程(重点)
<1>流程图
<2>安全模式
在集群启动时,hdfs处于安全模式,不允许写操作(此时nn和dn在交互)
hdfs dfsadmin -safemode enter/leave/wait/get