写流程
写:hdfs dfs -put /export/software/jdk /
- 1-客户端读取配置文件,找到NameNode的地址
- 2-客户端向NameNode发送写入请求
- 3-NameNode会检查是否允许写入将确认同意写入的,结果返回给客户端
- 检查文件是否存在
- 是否有权限
- 存储路径是否存在
- 有没有DataNode可以存储
- 4-客户端会将大文件进行拆分成若干个小文件
- 5-提交第一个块写入的请求给NameNode
- 6-NameNode根据当前集群的情况以及副本的个数,返回三台DataNode的地址
- NameNode会根据副本:3份
- 根据机架感知做基本计算:如果客户端所在的机器也是DataNode会存储一份(
以后如果客户端这台机器进行读的时候,可以直接从本机快速读取
),与客户端在同一个机架的另外一台机器也会存储一份(如果客户端这台机器宕机,从同机架获取这个块,是最快的
),另外一个机架的一台机器也会存储一份(如果第一个机架全部宕机,另外一个机架照样有一份可以用
) - 机架:路由器
这个不是绝对的。如果我们只有一个机架?如果我只有一台机器?
- 7-客户端拿到这三台DataNode的地址,通过机架感知,选择最近的一台进行写入块
- 8-客户端将整个块分成很多小的部分,每个部分挨个发送给DataNode
- 9-最近的DataNode接受到写入请求,将这个数据同步给其他两个DataNode
- 10-所有的DataNode写入完成逐级返回ack确认,客户端接受到ack,发送下一个小的部分,直到整个块发送完成
- 11-客户端重复第5步,提交下一个块的写入请求,直到整个文件所有块写完成
读流程
读取:hdfs dfs -get /jdk /export/software
- 1-客户端向NameNode请求读取一个文件
- 2-NameNode检查元数据
- 3-返回这个文件对应的所有的块的所有的DataNode地址
- 4-客户端根据地址列表,计算出每个块离自己最近的那台DataNode
- 5-到离自己最近的每台机器,取对应的块
- 6-将每个块进行合并