一. HDFS写流程

eshadoop读取hdfs写入es hdfs数据读取和写入流程_hdfs读写流程

1)首先,客户端利用HDFS Client创建了Distributed FileSystem实例,再通过

Distributed FileSystem向NameNode发起上传文件的请求,NameNode会检查目标文件是否存在,父目录是否存在。

eshadoop读取hdfs写入es hdfs数据读取和写入流程_目标文件_02

2)NameNode返回是否可以上传的响应信息。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_hdfs读写流程_03

3)客户端再次向NameNode请求可以存储第一个块的DataNode的地址信息(HDFS按块存储,默认块大小为128M)。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_HDFS_04

eshadoop读取hdfs写入es hdfs数据读取和写入流程_HDFS_05

4)NameNode返回存储数据的DataNode地址,NameNode在寻找DataNode节点时会选择距离待上传数据最近距离的DataNode(计算方式如上图

网络拓扑-节点距离计算)。

eshadoop读取hdfs写入es hdfs数据读取和写入流程_HDFS_06

5)客户端通过FSDataOutputStream模块向DataNode1请求上传数据,DataNode1接收到信息后,会对DataNode2,DataNode3接着发起请求,直到通道建立完成。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_eshadoop读取hdfs写入es_07

6)DataNode逐级应答,直到客户端收到消息。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_客户端_08

7)客户端向DataNode1上传第一个block(先从磁盘读取数据放到本地内存缓存),以packet为单位,DataNode1收到packet之后就会将它传给DataNode2,DataNode2传给DataNode3,

DataNode每传一个packet就会将它放入应答队列,当所有DataNode都复制完成就会应答成功。

eshadoop读取hdfs写入es hdfs数据读取和写入流程_HDFS_09

8)当第一块传输完成后,客户端会再次向NameNode请求传输第二块,重复3-7步,当传输完成后,客户端将告诉NameNode传输结束,客户端关闭FSDataOutputStream。

二、机架感知副本节点选择

eshadoop读取hdfs写入es hdfs数据读取和写入流程_hdfs读写流程_10

1)第一个副本在Client所处的节点上,如果客户端在集群外,则随机选取一个。2)第二个副本位于第一个副本的同一机架的不同节点(随机选择)。3)第三个副本位于不同机架的随机节点。

三、HDFS读流程

eshadoop读取hdfs写入es hdfs数据读取和写入流程_客户端_11

1)客户端首先利用HDFS Client创建

Dist ributed FileSyste m实例,通过 Dist ributed FileSyste m向NameNode发起下载文件的请求。

eshadoop读取hdfs写入es hdfs数据读取和写入流程_hdfs读写流程_12

2)NameNode搜索到目标文件元数据后将其返回。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_HDFS_13

3)客户端通过FSDataOutputStream模块向最近的DataNode请求读取数据。


eshadoop读取hdfs写入es hdfs数据读取和写入流程_hdfs读写流程_14

4)DataNode从磁盘读取数据输入流,以packet为单位做校验,发送给客户端。客户端以packet为单位接收,先在本地缓存,再写入目标文件。

eshadoop读取hdfs写入es hdfs数据读取和写入流程_eshadoop读取hdfs写入es_15