HDFS写流程
客户端发起写请求道namenode,namenode返回可使用的资源,客户端根据资源使用情况对要写入的数据分块,逐一上传块到datanode,datanode获取上传块数据并写入磁盘,完成后报告给namenode块信息,同时也告诉客户端写入成功,客户端继续后续快的写入,在此期间namenode接受到datanode的块写入完成信息之后根据备份数直到满1 首先客户端发起写请求到namenode,nanmenode检查目标是否存在,父目录是否存在。
2 namenode通知client是否可以上传。
3 client上传时,先对文件进行切分成块,默认block为128MB。client向namenode请求第一个block需要传输到哪个datanode上。
4 namenode接收到请求,返回datanode节点,默认为3(d1在datanode的节点上d2在datanode的不同节点上,d3在不同datanode的任意节点上)。
5、client请求一台datanode上传数据(本质上是一个RPC调用,建立pipeline),第一个datanode收到请求会继续调用第二个datanode,然后第二个调用第三个datanode,将整个pipeline建立完成,逐级返回客户端 即客户端请求d1上传数据,d1收到请求会继续调用d2,然后d2调用d3建立通信管道。
6 三个节点逐级答应客户端
7 客户端开始往d1节点上传第一个block(先从磁盘中读取数据放到一个本地内存缓存),以packet(数据包,64kb)为单位。
8 当第一个block传输完后,客户端再次请求namenode上传第二个接收block的datanode节点,直到满足备份为止
HDFS读流程
客户端发发起请求到namenode,namenode返回可使用资源,客户端根据使用资源到对应的datanode上读块数据,客户合并文件数据
1 和namenode通信查询元数据(block所在的datanode节点),找到块所在的datanode服务器
2 挑选一台datanode(就近原则,然后随机)服务器请求建立socket(套接字)流
3 datanode发送数据,从磁盘读取数据放入流,以packet为单位来做校验。
4 客户端以packet为单位接收,现在本地缓存,然后写入目标文件,最后合成文件。