hdfs写文件流程
hdfs读写流程
1、调用客户端对象DistributedFileSystem的create()方法
2、DistributedFileSystem向NameNode发送一个RPC连接,请求创建一个文件,不包含Block块的请求,NameNode会进行各种检查,确保文件不存在,并且客户端有创建的权限,通过检查后,在edits log中创建文件,否则创建失败客户端抛异常IOException
3、DistributedFileSystem返回一个对象FSDataOutputSteam给客户端用于写数据,FSDataOutputSteam封装了一个DFSOutputSteam负责客户端跟DataNode和NameNode通信
4、FSDataOutputSteam对象将数据切分成小的数据块(64kb),并写入到一个内部队列(“数据队列”),DataSteam会读取其中的内容,请求NameNode返回一个DataNode列表来存储block块,列表中的DataNode会形成一个管线,DataSteam会想将数据发送给管线中第一个DataNode,第一个再发送给第二个,第二个发送给第三个。。。
5、DFSOutputStream维护这一个数据包的队列,称为确认队列,这个数据包需要写入DataNode中,当一个数据包在管线中的所有队列写入完成后,就从ack队列中移除该数据包。如果有多个block块,则会反复从步骤4开始执行
6、当客户端完成了数据的传输,调用数据流的close()方法,该方法将数据队列中的剩余数据包写入DataNode的管线并等待管线的确认
7、客户端收到管线中所有正常DataNode确认信息后,通知NameNode文件写完了
**注意:**如果在写入期间DataNode发生故障,执行以下操作
1、关闭管线,把确认队列中的所有数据包都添加回数据队列的最前端,以保证故障下游的DataNode不会漏掉任何一个数据包
2、为存储在另一正常的NameNode的当前数据指定一个标志,并将标志发送给NameNode,以便故障DataNode恢复后可以删除存储的部分数据块
3、从管线中删除故障节点,并把余下的数据写入管线的另外两个正常的DataNode,NameNode检测到副本数量不足后,会在另一个节点上创建新的副本

hdfs读文件流程
hdfs读写流程
1、客户端通过FileSteam对象的open()方法打开希望读取的文件。DistributedFileSystem通过RPC连接调用NameNode,以确保文件起始位置,对于每个block,NameNode返回存有该副本的DataNode位置信息,这些DataNode会根据它们与客户端的距离来排序,读取最近的一个DataNode上的文件信息。如果客户端本身就是一个DataNode,会从本地读取
2、DistributedFileSystem返回一个FSDataInputStream对象给客户端读取数据,该类封装了DFSInputStream,该对象管理着DataNode和NameNode的IO,用于给客户端使用。客户端读这个输入调用read()方法,存储着文件起始几个block和DataNode的地址的DFSInputSteam连接距离最近的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode传输到客户端,到达block末端时,DFSInputStream关闭与DataNode的连接,然后寻找下一个block的最佳DataNode,客户端只需读取连续的流,并且对于客户端都是透明的
3、客户端从流中读取数据时,block是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也会根据需要询问namenode来检索下一批数据块的datanode的位置。一旦客户端完成读取,就close掉FSDataInputStream的输入流。
4、在读取数据的时候如果DFSInputStream在与datanode通信时遇到错误,会尝试从这个块的一个最近邻datanode读取数据。它也记住那个故障datanode,保证以后不会反复读取该节点上后续的block。DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现有损坏的块,就在DFSInputStream试图从其他datanode读取其副本之前通知namenode。

相关文章:

猜你喜欢
  • 2021-09-08
  • 2021-06-02
  • 2021-06-08
相关资源
相似解决方案