【Juicy-Bigdata】Hadoop之HDFS读写数据分析

RPC原理分析及应用

image-20221108145458651

RPC接口分析

  • ClientProtocol: HDFS客户端与NameNode通信的接口
  • DatanodeProtocol: DataNode与NameNode通信的接口
  • NamenodeProtocol:SecondaryNameNode与NameNode通信的接口

HDFS写数据过程

image-20221109140523259

  1. Client发起文件上传请求,通过RPC与NameNode建立通讯**(ClientProtocol)**。 NameNode检查目标文件是否存在,父目录是否存在,返回是否可以上传

  2. Client请求第一个block该传输那几个DataNode服务器上

  3. NameNode根据配置文件中指定的备份数量以及机架感知原理进行文件分配,返回可用的DataNode地址:A,B,C

    Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在HDFS 上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份

    image-20221109145905991
  4. Clien请求3个DataNode中的A上传数据,通过RPC**(DatanodeProtocol)**建立pipeline。A收到请求后会继续调用B,然后B调用C,将整个通信管线建立。然后逐级应答客户端

  5. Client开始往A上传第一个Block(从磁盘读取放到本地内存缓存),以packet(64k)为单位,A收到一个packet就会传给B ,B 传给C。A每传一个packet会放入一个应答队列等待应答

  6. 在pipeline的反方向上,逐个发送ack,最终由pipeline中的第一个节点A将Pipelineack发送给client

  7. 一个block传输完成后,client再次请求第二个block,重复2-7.

HDFS读数据过程

image-20221109150323409

  1. Client向NameNode发送RPC请求,确定请求文件block所在的位置
  2. NameNode返回文件的block列表。对每个block,返回包括该副本的DataNode地址。这些DN地址会按照集群拓扑结构得出与客户端的距离,然后进行排序。1. 距离近的靠前 2. 心跳机制中超时汇报靠后
  3. Client选取靠前的DataNode来读取block,或者就是自己
  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合并为一个文件