-
客户端向NameNode发起RPC请求,请求文件block位置
-
NameNode检查是否有访问权限,如果有权限则继续检查是不是有这个文件,如果有这个文件则返回部分或全部的block列表,对于每个block,NameNode会返回含有该副本的DataNode地址
-
客户端根据就近原则挑选一台DataNode,请求读取数据
-
DataNode开始传数据给客户端
-
当读完列表的block后,若文件读取没有结束,向NameNode获取下一批block列表
-
读取完一个block会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后从下一个拥有该block的DataNode继续读取
-
客户端以packet为单位接收数据,先存入缓存
-
最终读取的所有block合并成一个完整的文件
可以这样理解:
我很喜欢玩拼图游戏也爱好收藏拼图,手里有很多个拼图,而且每个拼图有多个相同的副本(因为我怕有一天丢失了找不到就不能玩了,多备几份以防丢失
- 你要在我的房间里找一个完整拼图,只不过这个东西被我分为了几个部分,而且这个拼图有三份被我放在不同的位置,你要找到所有的模块才能拼成一个完整的拼图
- 我是不是想让你玩这个拼图游戏,如果我也想让你玩也得看看我有没有这个拼图,如果有我给你提供这张拼图的所有块都在哪个地方写在本本上分页提供给你
- 你非常聪明人格也高尚,为了给国家省粮食在我给你的地点里挑最近的地方去取所有的地图块
- 把地图块一块一块收集起来
- 如果在我给你的一页上没有找到所有的块,你再来找我要剩下的地图块对应的信息
- 拿到地图块之后先看看这个地图块是不是又破损,如果有破损则去另外一个地方去拿相同的一块
- 拿到地图块后先把地图块放在随身的背包里
- 最终开心的将每个地图块拼成一张完整的地图



