1、读与写数据流程
写数据流程:
1)客户端发出请求上传文件
2) namenode查看维护的目录结构,检查目录是否存在,如果不存在
直接报错“no such file or directory”,如果存在,返回给客户端同意上传文
件请求。将操作写入日志文件(edits)
3) 客户端上传第一个块,询问namenode块的存储位置
4) namenode查看自己的datanode池,返回给客户端一个datanode列表
5) 客户端发出请求建立pipeline(管道)
6) 客户端先把文件写入缓存,达到一个块的大小时,会在客户端和第一个datanode建
立连接开始流式传输数据
这个datanode会一小部分一小部分(4k)的接收数据然后写入本地仓库,同时会把
这些数据传输到第二个datanode
第二个datanode也同样一小部分一小部分的接收数据并写入本地仓库,同时传输给第
三个datanode。(在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列
响应完成后返回给客户端)
7) 第一个数据块传输完成后会使用同样的方式传输下面的数据块知道整个文件上传完成
8) 整个文件完成,namenode更新内存元数据
读数据流程:
1)客户端向namenode发起RPC调用,请求读取文件数据
2)namenode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表)
3)客户端收到元数据后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先
要校验文件是否损坏,如果损坏,客户端会选取另外的datanode请求
4)datanode与客户端建立socket连接,传输对应的数据块,客户端收到数据缓存到本地,之后写入文件
5)依次传输剩下的数据块,直到整个文件合并完成
2、namenode的启动过程
1)加载镜像文件,还原了checkpoint时间节点前的元数据(包含目录结构,文件大小,块大小,块的id等等),不包含块的存储位置
2)加载edits文件,还原了checkpoint时间节点到集群停止的元数据,不包含块的存储位置,(至此namenode还原的元数据唯一缺失的就是块的存储位置)
3)blockreport阶段,datanode启动,向namenode汇报自己所管理的块及块的id,namenode根据块的ID还原块的存储位置
4)在blockreport结束后,集群会判断,datanode的启动数量(可设置,默认为0),丢失的块的占比(可设置,默认0.999f)
是否满足退出安装模式的条件,如果满足,30s后退