1.1:HDFS读流程
①客户端向Namenode发送读请求,申请数据块(block)位置信息
②Namenode收到请求后,先检查是否有这个文件 其次检查是否有足够的权限,然后返回block列表
(针对于每个block,Namenode都会返回该block的Datanode地址)
③返回的每个DN地址按照集群拓扑结构找出距离客户端最近的节点,来读取block信息(可以理解为就近原则,短路读取特性)
④客户端以Packet为单位接收,先在本地缓存,然后写入目标文件
⑤当读完列表的 block 后,若文件读取还没有结束,客户端会继续向 Namenode 获取下一批的 block 列表
⑥写完后关闭输入流
⑦最终读取来所有的 block 会合并成一个完整的最终文件
tips
读方法是并行的读取 block 信息,不是一块一块的读取;Namenode 只是返回 Client请求包含块的 DataNode 地址,并不是返回请求块的数据
1.2:HDFS写流程
①客户端于Namenode建立通信并发送上传请求,Namenode检查权限,并检查目标目录是否有同名文件,两者有其一不满足则报错,如果满足,则返回给client一个可以上传的地址
②客户端根据上传文件的大小进行切块(默认128MB),切块后询问Namenode第一个block上传到哪个节点(Datanode)
③Namenode收到请求后,根据网络拓扑和机架感知以及副本放置机制进行文件分配,返回可用的Datanode地址
tips:Hadoop在设计时考虑到数据安全性和HA(高可用),上传的数据文件默认保存三个副本,存储策略为(本地一份,同机架内不同节点一份,不同机架一份)
④客户端收到Namenode返回的地址列表后,会与列表中的一个节点A建立pipeline,然后节点A调用节点B,节点B调用节点C,将整个数据管道建立完成,然后逐级反馈给客户端
⑤客户端收到反馈后,开始上传第一个block块,由搭建的pipeline依次传输,传输完成后,节点A将pipelineACK发送给客户端
tips:以包为单位64KB,从本地磁盘读取,放到本地内存缓存
⑥第一个block上传完成后,客户端再次申请上传第二个block,Namenode重选三台节点发送给客户端,重复以上操作
随时进行补充更新