一、HDFS读写流程
①HDFS写流程
1)client 客户端发送上传请求,通过 RPC 与 namenode 建立通信,namenode 检查该用户是否有上传权限,以及上传的文件是否在 hdfs 对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息。
2)client 根据文件的大小进行切分,默认 128M 一块,切分完成之后给namenode 发送请求第一个 block 块上传到哪些服务器上。
3)namenode 收到请求之后,根据网络拓扑和机架感知以及副本机制进行文件分配,返回可用的 DataNode 的地址
4)客户端收到地址之后与服务器地址列表中的一个节点如 A 进行通信,本质上就是 RPC 调用,建立 pipeline,A 收到请求后会继续调用 B,B 在调用 C,将整个 pipeline 建立完成,逐级返回 client。
5)client 开始向 A 上发送第一个 block(先从磁盘读取数据然后放到本地内存缓存),以 packet(数据包,64kb)为单位,A 收到一个 packet 就会发送给B,然后 B 发送给 C,A 每传完一个 packet 就会放入一个应答队列等待应答
6)数据被分割成一个个的 packet 数据包在 pipeline 上依次传输,在pipeline 反向传输中,逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client。
7)当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个block ,namenode 重新选择三台 DataNode 给 client
②HDFS读流程
1)client 向 namenode 发送 RPC 请求。请求文件 block 的位置
2)namenode 收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的 block 列表,对于每个 block,NameNode都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后
3)Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)
4)底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕
5)当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表
6)读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读
7)read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据
8) 最终读取来所有的 block 会合并成一个完整的最终文件
二、HDFS 在读取文件的时候,如果其中一个块突然损坏了怎么办
客户端读取完 DataNode 上的块之后会进行 checksum 验证,也就是把客户端读取到本地的块与 HDFS 上的原始块进行校验,如果发现校验结果不一致,客户端会通知NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读。
三、HDFS 在上传文件的时候,如果其中一个 DataNode 突然挂掉了怎么办
客户端上传文件时与 DataNode 建立 pipeline 管道,管道正向是客户端向DataNode 发送的数据包,管道反向是 DataNode 向客户端发送 ack 确认,也就是正确接收到数据包之后发送一个已确认接收到的应答,当 DataNode 突然挂掉了,客户端接收不到这个 DataNode 发送的 ack 确认,客户端会通知 NameNode,NameNode 检查该块的副本与规定的不符,NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不再让它参与文件上传与下载。
四、HDFS 的组织架构
1)Client:客户端
(1)切分文件。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行存储
(2)与 NameNode 交互,获取文件的位置信息
(3)与 DataNode 交互,读取或者写入数据
(4)Client 提供一些命令来管理 HDFS,比如启动关闭 HDFS、访问 HDFS 目录及内容等
2)NameNode:名称节点,也称主节点,存储数据的元数据信息,不存储具体的数据
(1)管理 HDFS 的名称空间
(2)管理数据块(Block)映射信息
(3)配置副本策略
(4)处理客户端读写请求
3)DataNode:数据节点,也称从节点。NameNode 下达命令,DataNode 执行实际的操作
(1)存储实际的数据块
(2)执行数据块的读/写操作
4)Secondary NameNode:并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上替换NameNode 并提供服务
(1)辅助 NameNode,分担其工作量
(2)定期合并 Fsimage 和 Edits,并推送给 NameNode
(3)在紧急情况下,可辅助恢复 NameNode