HDFS读写流程

本文章主题:

  • 写流程
  • 读流程
HDFS遵循一次写入多次读取的原则,因此已经写入文件系统的文件是无法修改的,只能进行删除,添加,读取操作。
  • 写流程

write.png
  1. 客户端调用DistributedFileSystem的Create()方法来创建一个新文件,DistributedFileSystem通过RPC向NameNode申请写入新文件;
  • NameNode通过对文件的权限以及文件是否已存在进行校验,校验通过则返回具体blockId以及DataNode列表给DistributedFileSystem,并在日志文件中追加记录。否则返回失败信息;

  • DistributedFileSystem返回给客户端一个FSDataOutputStream对象,供客户端进行写操作。FSDataOutputStream对象中封装了一个DFSOutputStream对象,管理着NameNode与DataNode之间的通信;

  • 客户端调用FSDataOutputStream对象的write()方法开始写入数据,DFSOutputStream对象将数据分成一个个数据包(package)并写入“数据队列”(data queue) ;

  • DataStreamer根据DataNode列表要求NameNode分配合适的新块来处理数据复本;

  • 这组DataNode组成一条管线,假如复本数为3,则这条管线就拥有3个复本。-- DataStreamer将数据包流式传输到管线中的第1个DataNode中,DataNode存储数据并将数据包传输给第2个,以此类推直至传输到管线中的最后一个节点;

  • DFSOutputStream同时维护着一个“确认队列”(ack queue) 来等待DataNode存储成功的确认回执,数据包从最后一个节点依次往前传递,DFSOutputStream收到所有确认信息之后,则删除数据包;

  • 客户端完成数据的写入之后,调用close()方法,关闭FSDataOutputStream;

  • DistributedFileSystem通知NameNode文件写入成功,NameNode同时将元数据写入内存;

  • 写过程故障处理:

    • 关闭管线,将数据包添加回数据队列的最前端,以确保下游的DataNode不会漏掉任何一个数据包;
    • 找到一个存储着当前数据块的DataNode(正常的),为它加上一个新的标识,并且将该标识传送给NameNode,便于在故障DataNode在恢复之后可以删除存储的部分数据块;
    • 从管线中删除故障节点,并且将数据块写入另外两个正常节点;
    • 当NameNode发现block复本数不足的时候,会在另外一个节点上创建一个新复本。
  • 读流程

read.png
  1. 客户端调用DistributedFileSystem的open()方法,告诉分布式文件系统对象(DistributedFileSystem)希望打开某个文件;
  • DistributedFileSystem通过RPC来调用NameNode节点,并从中获取block文件块的在datanode地址;
  • DistributedFileSystem将位置信息封装成FSDataInputStream对象返回给客户端,FSDataInputStream对象中封装了一个DFSInputStream对象,它管理着DataNode与NameNode之间的I/O;
  • 客户端调用FSDataInputStream对象的read()方法,DFSInputStream对象随即连接最近的DataNode,通过反复调用read()方法,将数据从DataNode传输给客户端;
  • 当客户端将所有的数据块读取完成,调用FSDataInputStream的close()方法,关闭数据流;
  • 在读取过程中出错,DFSInputStream会尝试读取临近DataNode中的block;
  • 在每读完一个block,DFSInputStream都会检验数据的完整性,如果有损坏,会试图在从其它DataNode读取复本之前通知NameNode。

** RPC是通过Java的动态代理以及Java的NIO实现的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HDFS读写流程剖析 本文为 《Hadoop The Definitive Guide 4th Edition》的...
    希尔大阅读 3,793评论 0 2
  • 先思考问题 我们处在一个大数据的时代已经是不争的事实,这主要表现在数据源多且大,如互联网数据,人们也认识到数据里往...
    墙角儿的花阅读 7,417评论 0 9
  • 一、操作方式 Hadoop支持的文件系统由很多(见下图),HDFS只是其中一种实现。Java抽象类org.apac...
    Mervey阅读 1,317评论 0 0
  • 正如标题所示,这个系列纯属是为了了解世界,生活在现代,我们都有自己的圈子,也有了微信的朋友圈去观望一下他人的世界,...
    思践于人阅读 370评论 0 0
  • 我的家乡在云台山脚下,小村庄就像一个孩子,依偎在云台山的怀抱。 没有人去测量山的海拔,因为崇敬它不会在...
    gwm阅读 310评论 0 2