读取数据原理
- 客户端访问namenode,发送读取数据请求
- namenode接收到用户发来的请求,首先会进行一系列的判断,判断用户是否有权限、判断目录下是否有对应文件等等,若未通过层层判断就报错,若均通过则根据机架感知原理、网络拓扑关系、副本机制返回部分或全部block所在的datanode的地址(文件过大时会分批处理)
- 客户端收到block列表后,开始并行连接datanode节点读取数据
- 数据读取完毕后,如果之前获取的是部分block列表的地址,那么会再次请求namenode,返回剩余block的datanode地址列表继续第三步,直到将所有block全部读取下来
- 最后按照block排序,将一个个block拼接起来合成一个最终文件呈现给用户
写入数据原理
- 首先客户端访问namenode,发送写入数据请求
- namenode收到请求后会进行一系列判断,包括用户是否具备相应权限、在写入目录下这个文件是否存在等等,若未通过判断则报错,若均通过则通知客户端可以上传
- 客户端收到允许通知将文件切分为128M的block
- 客户端向namenode发送请求,询问第一个block存储在那些地方
- namenode根据几家感知原理、网络拓扑关系、副本机制等找到相应的可以上传的datanode连接列表,返回给客户端
- 客户端从接收到的datanode列表中选择第一台datanode与之相连建立管道
- 当连接好第一台datanode后,第一台与第二台连接,第二台与第三台连接形成一条pipeline管道
- 客户端以package包的形式(每个64KB)发送数据,第一个datanode接受完之后发送第二个,第二个接收好之后发送给第三个
- 当最后一个接收请求后会建立一个反向的应答队列,当而每个节点都接收完成数据包之后,依次向客户端发送ack应答机制
- 此时数据开始源源不断发送传输,当第一个block发送完成之后,客户端会重新请求namenode第二个block块应该存储在哪些datanode中,接着从第五步继续,直到所有的block全部写入完成