HDFS的体系架构
NameNode:名称节点
- 是HDFS的主节点、管理员
- 接收客户端(命令行、java程序)的请求:创建目录、上传数据、下载数据、删除数据等
- 管理和维护HDFS的日志和元信息
日志文件(edits文件):记录的是客户端的所有操作,是一个二进制文件(JSON)
位置:/root/training/hadoop/tmp/dfs/name/current
edit_inprogress_00000000000000XXXXX:正在操作的日志文件
hdfs oev -i edits_inprogress_00000000000000XXXXX -o ~/a.xml:通过日志查看器(edits viewer),把edits文件转换成文本(xml)格式
元信息(fsimage文件):记录的是数据块的位置信息,数据块的冗余信息,是一个二进制文件
位置:/root/training/hadoop/tmp/dfs/name/current
fsimage_0000000000000XXXXX:元信息记录文件
hdfs oiv -i fsimage_000000000000XXXXX -o ~/b.xml:将元信息记录文件转换成文本(xml或txt)格式 - HDFS元信息保存位置配置
1
2
3
4
5hdfs-site.xml:
<property>
<name>dfs.name.dir</name>
<value>储存位置</value>
</property>
DataNode:数据节点
- 按照数据块保存数据
1.X : 64M
2.X : 128M - 数据块:表现形式就是一个文件(blk打头)
位置:/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-XXX-数据节点-XXX/current/finalized/subdir0/subdir0/
一个数据块对应的是一对文件,‘.meta’记录的是数据块的元信息
设置数据块冗余度规则:一般跟数据节点个数相同,但最大不要超过3
Hadoop 3.X之前,会造成存储空间极大的浪费
Hadoop 3.X之后,采用HDFS纠删码技术,使得存储空间节约一半 - HDFS文件系统的保存位置配置
1
2
3
4
5hdfs-site.xml:
<property>
<name>dfs.data.dir</name>
<value>储存位置</value>
</property>
SecondaryNameNode:第二名称节点
- 职责:进行日志信息的合并
SecondaryNameNode向NameNode下载edits日志文件和fsimage元信息文件
将edits中最新的信息写入fsimage文件
将合并后的文件上传给NameNode
当上次合并发生以后,用户进行新的操作,NameNode将产生新的edits_inprogress
当HDFS发出检查点(checkpoint)的时候,会进行日志信息合并
默认情况下,HDFS每隔60分钟或edits文件达到了64M产生一个检查点 - 由于edits文件记录了最新的状态信息,并且随着操作越多,edits就会越大
- 把edits中的最新信息写到fsimage中
- edits文件就可以清空
- 配置SecondaryNameNode节点位置
1
2
3
4
5hdfs-site.xml:
<property>
<name>dis.namenode.secondary.http-address</name>
<value>RedHat112:50090</value>
</property>
HDFS基础命令
- hdfs dfs -help :查看帮助
- hdfs dfs -ls / :列出/目录下的文件和目录
- hdfs dfs -put /本地路径 /上传路径 :上传文件
- hdfs dfs -moveFromLocal /本地路径 /上传路径 :剪切上传文件
- hdfs dfs -get /hdfs路径 /本地路径 :下载文件
- hdfs dfs -getmerge /hdfs目录(是一个文件夹) /合并后的文件 :合并下载
- hdfs dfs -mkdir /目录名 :创建目录
- hdfs dfs -mkdir -p /目录名/目录名 :创建多级目录
- hdfs dfs -mv /需要移动的目录(文件) /需要移动到的位置 :移动文件/文件夹
- hdfs dfs -copy /需要复制的目录(文件) /需要复制到的位置 :复制文件/文件夹
- hdfs dfs -rm /文件路径 :删除文件
- hdfs dfs -rm -r /目录路径 :删除目录
- hdfs dfs -cat /文件路径 :查看文件
- hdfs dfs -tail -f /文件路径 :查看文件的最后指定行
- hdfs dfs -count /目录路径(文件路径) :查看目录(文件)文件夹数,文件数、大小
- hdfs dfs -df -h / :查看hdfs的总空间
- hdfs dfs -setrep 冗余度 /文件路径 :设置单个文件冗余度
简单的HDFS上传文件代码
1 | package hdfs.demo1; |
HDFS写数据流程
- 请求N阿么N哦的上传文件123.txt(客户端——》NameNode)
- 响应可以上传的文件(NameNode——》客户端)
- 请求上传第一个Block(块文件)(0~120m),请求分会DataNode(客户端——》NameNode)
- 返回DataNode1,DataNode2,DataNode3,表示采用这两个酒店储存具体的数据(NameNode——》客户端)
- 请求建立一个Block传输通道(客户端——》DataNode1——》dataNode2——》dataNode3)
- DataNode1,DataNode2,DataNode3应答成功(DataNode——》客户端)
- 传输数据(客户端——》DataNode1——》dataNode2——》dataNode3)
HDFS读数据流程
- 请求下载文件(客户端——》NameNode)
- 返回目标文件的元数据(NameNode——》客户端)
- 通过元信息请求第一块数据(客户端——》DataNode)
- 传输数据给客户端(DtatNode——》客户端)
- 继续通过元信息请求第二块数据。。。
NameNode与SecondaryNameNode工作机制
- 启动集群,加载edits(编辑日志)与fsimage(镜像文件)
- 元数据增删查改(客户端——》NameNode)
- SecondaryNameNode请求是否需要CheckPoint(SecondaryNameNode——》NameNode)
- SecondaryNameNode请求执行CheckPoint(SercondaryNameNode——》NameNode)
- CheckPoint触发条件:1.通过定时;2.通过edits操作记录数量
- CheckPoint触发时,SecondaryNameNode向NameNode拷贝edits文件并加载到内存(SercondaryNameNode——》NameNode)
- 生成新的镜像文件fsimage.chkpoint
- 将fsimage.chkpoint拷贝到NameNode(SercondaryNameNode——》NameNode)
- NameNode将fsimage.chkpoint重命名为fsimage,再次发送到SecondaryNameNode当中(SercondaryNameNode——》NameNode)
- NodeName与SencondaryNameNode将新的fsimage加载到内存中
HDFS重点
- 一、工作机制
- 二、读写流程
- 三、客户端api
- 四、集群部署安装