1 HDFS概述
HDFS(Hadoop Distributed File System),Hadoop分布式文件系统
hdfs适合一次写入、多次读出,不支持文件修改,可以追加。
1.1 HDFS组成架构
Namenode(nn):名称节点
存储元数据
管理HDFS的命名空间,配置副本策略,管理块block,处理客户端读写请求。
Datanode(dn):数据节点
存储实际数据,存储的位置在/opt/module/hadoop-3.1.3/data/dfs/data下。
SercondaryNamenode(2nn):第二名称节点
namenode的助手,不是namenode的热备份,当namenode宕机不能顶替namenode工作,可以帮助恢复namenode
1.2 HDFS文件块
HDFS文件在物理上是分块存储的,在hadoop2x - hadoop3x的版本中一个块是128M,之前的老版本是64.
hdfs文件块的大小为什么不能设置太大?为什么不能设置太小?
原因:
文件块太小,块太多了会增加寻址时间。
文件块太大,寻址块了,但是从磁盘传输数据的时间会太长,导致程序处理这个数据太慢。
总结:HDFS块的大小取决于磁盘的传输速度。
4 HDFS的数据流
4.1 HDFS写数据流程
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode相应是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
如何选择3个节点?
选择距离namenode距离最近的datanode接收数据。(网络拓扑-节点距离计算。)
- 第一个副本:在Client所处的节点上,如果客户端在集群外,那么就随机选择一个。
- 第二个副本:在另一个机架的随机一个节点上。
- 第三个副本:在第二个副本所在机架的随机节点上。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
为什么要用这种通信管道的方式上传数据?
如果客户端连接dn1,dn2,dn3并联的方式传输,IO压力太大,每个人都传输一份数据,传输效率也低。只传给dn1,效率会高,传输过程dn2也会和dn3传输。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
4.2 HDFS读数据流程
(1)客户端通过DistributedFileSystem向Namenode请求下载文件。
(2)Namenode通过查找元数据,找到文件块所在的datanode节点,挑选一台datanode,就近原则。
(3)客户端根据namenode返回的datanode发送请求。分块请求。
(4)datanode传输给客户端。
真正的数据块存储在datanode的这个路径下:
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-36455346-192.168.255.102-1602322387076/current/finalized/subdir0/subdir0/