3.2 HDFS架构和原理
3.2.1 HDFS存储架构
•HDFS采用主从架构(Master/Slave架构)。
•HDFS集群是由一个NameNode和多个的 DataNode组成。

3.2.2 HDFS读写原理
1. HDFS写数据原理
Client从HDFS中存储数据,即为Write(写)数据。

1) 客户端发起文件上传请求,通过RPC(远程过程调用)与NameNode建立通讯
2) NameNode检查元数据文件的系统目录树
3) 若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件
4) 客户端请求上传第一个Block数据块以及数据块副本的数量
5) NameNode检测元数据文件中DataNode信息池,找到可用的数据节点
6) NameNode检查元数据文件的系统目录树
7) 若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件
8) DataNode之间建立Pipeline后,逐个返回建立完毕信息
9) 客户端与DataNode建立数据传输流,开始发送数据包
10) 客户端向DataNode_01上传第一个Block数据块,当DataNode_01收到一个Packet就会传给DataNode_02,DataNode_02传给DataNode_03,DataNode_01每传送一个Packet都会放入一个应答队列等待应答
11) 数据被分割成一个个Packet数据包在Pipeline上依次传输,而在Pipeline反方向上,将逐个发送Ack,最终由Pipeline中第一个DataNode节点DataNode_01将Pipeline的 Ack信息发送给客户端。
12) DataNode返回给客户端,第一个Block块传输完成。客户端则会再次请求NameNode上传第二个Block块和第三块到服务器上,重复上面的步骤,直到3个Block都上传完毕。
2. HDFS读数据原理
从HDFS中查找数据,即为Read(读)数据。

1) 客户端向NameNode发起RPC请求,来获取请求文件Block数据块所在的位置。
2) NameNode检测元数据文件,会视情况返回Block块信息或者全部Block块信息,对于每个Block块,NameNode都会返回含有该Block副本的DataNode地址。
3) 客户端会选取排序靠前的DataNode来依次读取Block块,每一个Block都会进行CheckSum若文件不完整,则客户端会继续向NameNode获取下一批的Block列表,直到验证读取出来文件是完整的,则Block读取完毕。
4) 客户端会把最终读取出来所有的Block块合并成一个完整的最终文件(例如:1.txt)。

