写数据流程
1. 客户端向nn请求写数据:hadoop fs -put /home/qf.log /data/qf/
2. nn检查目录/data/qf/是否存在
3. nn发现目录存在同意客户端写数据
4. 客户端告诉nn要上传第一个块
5. nn查询dn池信息
6. nn返回给客户端存储块文件的dn列表.namenode会根据客户端的配置来查询datanode信息,如果使用默认配置,那么最终结果会返回同一个机架的两个datanode和另一个机架的datanode。这称为“机架感知”策略。
7. 客户端发出请求建立pipeline
8. 客户端开始写数据
客户端在开始传输数据块之前会把数据缓存在本地,当缓存大小超过了一个数据块的大小,会在客户端和第一个datanode建立连接开始流式的传输数据,这个datanode会一小部分一小部分(4k)的接收数据然后写入本地仓库,同时会把这些数据传输到第二个datanode,第二个datanode也同样一小部分一小部分的接收数据并写入本地仓库,同时传输给第三个datanode(在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列响应完成后返回给客户端),依次类推。这样逐级调用和返回之后,待这个数据块传输完成客户端后告诉namenode数据块传输完成,这时候namenode才会更新元数据信息记录操作日志。
9. 第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。
读数据流程
(1)客户端向namenode发起rpc调用,请求读取文件数据。
(2)namenode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表)。
(3)客户端收到元信息后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的datanode请求。
(4)datanode与客户端建立socket连接,传输对应的数据块,客户端收到数据缓存到本地,之后写入文件。
(5)依次传输剩下的数据块,直到整个文件合并完成