一、HDFS概述
HDFS集群由NameNode,DataNode,SecondaryNameNode构成。
NameNode:接受用户请求。存储元数据(描述文件的数据,如文件名、文件大小、目录名、文件创建时间等)
DataNode:负责管理用户的文件数据块(block),通过心跳机制汇报给NameNode。
(1)文件默认会按照每128M切分为block块存储在DataNode上,每个block块默认会有三个副本存放在不同的DataNode上
(2)DataNode会定期向NameNode汇报自身所保存的文件block块信息
SecondaryNameNode:主要负责辅助NameNode,定期合并fsimage(快照文件)和edits(日志文件),并同步一份给NameNode
二、元数据的checkpoint机制(NameNode与DataNode的联系)
三、HDFS写数据流程
宏观:
微观:
HDFS写数据流程
1.客户端使用rpc通信框架向NameNode发送请求,NameNode接收并处理用户的请求。
2.NameNode审核用户文件的操作权限,文件路径,磁盘空间是否可用,审核通过后,NameNode会返回成功状态给DFS(分布式文件系统)
3.如果DFS接收到成功的状态,会创建一个FSDataoutputStream的对象给客户端使用
4.客户端向NameNode获取文件存储在HDFS中所需要的所有DataNode节点
5.NameNode对客户端划分的block块分配好所有的DataNode
6.客户端通过机架感知与最近的DataNode建立联系,将block块划分为2048个packet进行发送,直到所有的packet发送完毕后,则当前的block块传输完毕,开始传输下一个block块中的packet
7.DataNode之间会形成pipeline通道传输这些packet
8.传输完毕后发送确认值给客户端
9.当最后一个block中的最后一个packet传输完毕后,释放FSDataoutputStream对象,关闭DataNode之间的pipeline通道,至此,写数据完成。
四、HDFS读数据流程
HDFS读数据流程
1.使用HDFS提供的client,向远程的NameNode发起RPC请求
2.namenode会视情况返回文件的部分block块信息列表或者全部block,对于每个block,namenode都会返回该block副本的DataNode地址
3.client会选取离最近的DataNode读取block块
4.建立socket流,DataNode发送数据,以packet的单位接收,先在本地缓存,然后写入目标文件。读取完block,关闭当前的datanode连接,再寻找下一个block最佳的datanode。
5.读取完block后且文件没有读取完,client继续向namenode获取下一批block块
6.后面的block块相对于append到前面的block块,最后合成最终需要的文件
7.读取一个block都会进行checksum验证。如果读取DataNode出现错误,client会通知NameNode,然后再从下一个拥有block的DataNode继续读