文件读取示意图
1、首先客户端通过FileSystem(就是HDFS的一个实例)的open方法打开要读取的实例
2、通过RPC调用请求NameNode这个文件的起始块的信息,NameNode会向客户端返回一个带有这个文件的起始块的列表
这个列表是排好序的,即按照存在起始块的DataNode和客户端的距离(根据网络拓扑结构确定)
3、客户端对最近的DataNode节点调用Read方法读取文件,需要时还会再次向NameNode节点发送请求下一批块的位置信息
4、当读完所有的块客户端关闭连接
文件写入示意图
1>客户端向NameNode发起写请求,首先在NameNode的系统文件命名空间中新建一个文件名
2>向DataNode节点写数据,写数据的同时DataNode会做异步的复制工作即把Block复制到别的节点上
3>每写一个节点的数据后该DataNode会向客户端发送一个消息,当所有的DataNode(不包括异步复制的DataNode)都向客户 端发送确认消息后表示文件写操作完成
补充:
A:上传的Block复制到哪些DataNode中
1>如果客户端运行在HDFS集群内部,那么副本1就放在本机
如果客户端运行在HDFS集群外部,那么副本1就随机挑选一台存储不繁忙的机器节点
2>副本2复制到与副本1不在同一个机架上的机器节点上