写的不到位的地方,欢迎评论指出不足之处
1、客户端通过 HDFS Client 将文件进行上传
● 与 NameNode 连接创建文件元数据(文件名、创建时间、大小、权限、文件与block块映射关系)
2、NameNode 对文件的元数据进行验证
● 是否有权限
● 是否文件已存在等
3、验证通过后,NameNode 触发副本放置策略
4、返还指定数量的 DataNode 并按距离因素,进行排序
● 注: HDFS Client 上传文件的节点(DataNode),是由 NameNode 决定的
● 注: HDFS Client 上传文件的第一个 DataNode 节点,也就是本机(首先本地要有 DataNode)
5、 HDFS Client 收到信息后,将文件写入 DataNode
● HDFS Client 和 DataNode 建立 TCP 连接 ( Pipeline传输 )
● HDFS Client 将 Packet 放入发送队列 DataQueue 中,并向第一个 DataNode发送
● 第一个 DataNode 收到 Packet 后,本地保存并发送给第二个 DataNode
● 第二个 DataNode 收到 Packet 后,本地保存并发送给第三个 DataNode
● 当 Block 传输完成,DataNode 各自向 NameNode 汇报,同时 HDFS Client 继续传输下一个 block。所以, HDFS Client 的传输和 Block 的汇报也是并行的
● 这一个过程中,上游节点同时发送下一个 Packet
● 注
● 客户端一个块为64MB,再次切割成若干64KB的小包(Packet ),每次读取文件使用更小单位(chunk/二进制)
● chunk 512b(512字节的数据) + chunknum 4b(4字节的校验和),来填充64KB的小包
● NameNode 存储 DataNode 的 Block 信息,是在 DataNode 向 NameNode 汇报时才会追加存储的数据
● 另
● 生活中类似工厂的流水线
● 流水线在大数据中,属于变种的并行计算
● HDFS 使用这种传输方式,副本数对于 HDFS Client 是透明的
● 流水线在大数据中,属于变种的并行计算
6、DataNode 挂掉后的处理
● 第三个 DataNode 挂了,无影响
● 第二个 DataNode 挂了,则第一个 DataNode 直接传送给第三个 DataNode
● 第一个 DataNode 挂了,客户端直接传送给第二个 DataNode
● 跳过挂掉的 DataNode,直接发送的小包(补差价的形式)是接收方下一组数据需要的内容
7、三个 DataNode (真实存活/正常运行)传送后,会向 NameNode 汇报情况,然后 NameNode 才会记录,而不是受命于客户端
● 3个 DataNode 向 NameNode 汇报的只有2个,副本总数不足时
● 此时 NameNode 会触发策略,让其中(真实存活的)DataNode 再复制出一块
● 最后一个块不足64MB时,有多少传送多少,就无所谓了
面试重点
1、当客户端与 NameNode 进行交互通过后,会触发副本放置策略
2、返回的副本 DataNode 是按距离排序列表
3、Pipeline 是变种的并行计算
4、副本放置策略的具体内容(副本放置策略 )