1.HDFS上传数据
- 客户端通过FileSystem.create()创建文件对象,同时在HDFS中DistibutedFileSystem具体实现了FileSystem类。客户端通过Distibuted FileSystem类向NameNode发送上传文件请求,NameNode收到请求后检查要上传的目标文件及路径是否存在。
- NameNode检查后向客户端发送允许上传的请求并返回DataNode节点信息和Block块信息。
- 客户端与DataNode中距离最近的一台节点通过FSDataOutPutStream建立连接并准备开始上传数据,与客户端建立连接的DataNode节点会与集群当中的其他节点依次建立通信连接。
- 客户端开始通过调用FSDataOutPutStream的create()方法向HDFS中的第一个Block写入数据。客户端在上传数据过程中会把数据切分成若干个(数据包)packets,每个packets的大小为64k;每个packets又由若干个chunk构成,每个chunk由为512bytes的数据和4位的关联校验和构成。为了防止数据传输过程中发生意外情况,通常会将数据经过dataQueued后在经由ack队列来防止意外情况的放生。
- 第一个DataNode在接收到数据后后通过与其他节点建立的通信通道将数据副本按照设定规则进行传输备份。
- 当第一个Block上传成功后,客户端将再次向NameNode请求上传第二个Block的节点。(重复3-5步)。
- 当所有数据均上传完成后DataNode会向NameNode发送上传完成的信息,NameNode将数据的元数据信息维护完成之后向客户端返回上传成功的回执。
2.HDFS读数据
- 客户端通过DistibutedFileSystem向NameNode发送下载文件的请求,NameNode收到客户端的请求后查询维护的元数据信息,找到文件所在的DataNode节点地址。
- 客户端收倒NameNode返回的元数据信息后与DataNode建立通信连接。
- DataNode开始向客户端传输数据(传输数据过程与上传数据过程相反,以packet为单位)。
- 客户端将接受的到的数据放入缓冲区,然后在写入文件。