`
flyingdutchman
  • 浏览: 353036 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hadoop深入学习:解析HDFS的写文件流程

阅读更多
        之前,我们已经学习过了HDFS的读写数据流程,详情请看《Hadoop深入学习:HDFS主要流程——写文件》,近来鄙人在看《Hadoop:The Definiyive Guide(3rd edition)》,发现之前的体会还有些不足,故在本章中,我们再来重温一下Client是如何向Hadoop的HDFS中写数据的。

        下面我们来先看看下面的“写”流程图:


        假如我们有一个文件test.txt,想要把它放到Hadoop上,执行如下命令:
引用

        # hadoop fs  -put  /usr/bigdata/dataset/input/20130706/test.txt   /opt/bigdata/hadoop/dataset/input/20130706  //或执行下面的命令
        # hadoop fs -copyFromLocal /usr/bigdata/dataset/input/20130706/test.txt  /opt/bigdata/hadoop/dataset/input/20130706
       
       

        整个写流程如下:
        第一步,客户端调用DistributedFileSystem的create()方法,开始创建新文件:DistributedFileSystem创建DFSOutputStream,产生一个RPC调用,让NameNode在文件系统的命名空间中创建这一新文件;
        第二步,NameNode接收到用户的写文件的RPC请求后,谁偶先要执行各种检查,如客户是否有相关的创佳权限和该文件是否已存在等,检查都通过后才会创建一个新文件,并将操作记录到编辑日志,然后DistributedFileSystem会将DFSOutputStream对象包装在FSDataOutStream实例中,返回客户端;否则文件创建失败并且给客户端抛IOException。
        第三步,客户端开始写文件:DFSOutputStream会将文件分割成packets数据包,然后将这些packets写到其内部的一个叫做data queue(数据队列)。data queue会向NameNode节点请求适合存储数据副本的DataNode节点的列表,然后这些DataNode之前生成一个Pipeline数据流管道,我们假设副本集参数被设置为3,那么这个数据流管道中就有三个DataNode节点。
        第四步,首先DFSOutputStream会将packets向Pipeline数据流管道中的第一个DataNode节点写数据,第一个DataNode接收packets然后把packets写向Pipeline中的第二个节点,同理,第二个节点保存接收到的数据然后将数据写向Pipeline中的第三个DataNode节点。
        第五步,DFSOutputStream内部同样维护另外一个内部的写数据确认队列——ack queue。当Pipeline中的第三个DataNode节点将packets成功保存后,该节点回向第二个DataNode返回一个确认数据写成功的信息,第二个DataNode接收到该确认信息后在当前节点数据写成功后也会向Pipeline中第一个DataNode节点发送一个确认数据写成功的信息,然后第一个节点在收到该信息后如果该节点的数据也写成功后,会将packets从ack queue中将数据删除。
        在写数据的过程中,如果Pipeline数据流管道中的一个DataNode节点写失败了会发生什问题、需要做哪些内部处理呢?如果这种情况发生,那么就会执行一些操作:
        首先,Pipeline数据流管道会被关闭,ack queue中的packets会被添加到data queue的前面以确保不会发生packets数据包的丢失;
        接着,在正常的DataNode节点上的以保存好的block的ID版本会升级——这样发生故障的DataNode节点上的block数据会在节点恢复正常后被删除,失效节点也会被从Pipeline中删除;
        最后,剩下的数据会被写入到Pipeline数据流管道中的其他两个节点中。
        如果Pipeline中的多个节点在写数据是发生失败,那么只要写成功的block的数量达到dfs.replication.min(默认为1),那么就任务是写成功的,然后NameNode后通过一步的方式将block复制到其他节点,最后事数据副本达到dfs.replication参数配置的个数。
        第六步,,完成写操作后,客户端调用close()关闭写操作,刷新数据;
        第七步,,在数据刷新完后NameNode后关闭写操作流。到此,整个写操作完成。     
       

      
  • 大小: 56.8 KB
分享到:
评论
1 楼 414005069 2013-12-07  
你好,能问个问题吗?data queue(数据队列)里的package是串行还是并行开启管道传递的吗?

比如:数据队列里有2个package,hadfs副本数为3。那么这两个package的写入顺序是同时开两个管道写,还是第一个package的管道写完并确认后第二个package才开始新建管道写呢?

相关推荐

    Hadoop学习总结之二:HDFS读写过程解析.doc

    主要是hdfs读写的代码分析。可依据该文档进行深入代码。

    Hadoop技术内幕 深入解析YARN架构设计与实现原理.pdf

    这是一本关于Hadoop源码解析的书籍,这本书从源码的角度讲解了Hadoop底层到底是如何工作的,这对我们学习和理解Hadoop有一个很好的帮助。

    Hadoop技术内幕:深入解析MapReduce架构设计与实现原理

    有前三章的内容前言第一部分 基础篇第1章 阅读源代码前的准备1.1 准备源代码学习环境1.1.1 基础软件下载1.1.2 如何准备Windows环境1.1.3 如何准备Linux环境1.2 获取Hadoop源代码1.3 搭建Hadoop源代码阅读...

    hadoop技术内幕 深入解析mapreduce架构设计与实现原理

    《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》由Hadoop领域资深的实践者亲自执笔,首先介绍了MapReduce的设计理念和编程模型,然后从源代码的角度深入分析了RPC框架、客户端、JobTracker、TaskTracker和...

    Hadoop技术内幕_深入解析HADOOP COMMON和HDFS架构设计与实现原理

    值得推荐,适合开发者学习使用。讲解Hadoop还不错,不过适合开发的看。

    Hadoop实战(第2版)

    1.3 本章小结第2 部分 数据逻辑.2 将数据导入导出Hadoop.2.1 导入导出的关键要素2.2 将数据导入Hadoop .2.2.1 将日志文件导入Hadoop技术点1 使用Flume 将系统日志文件导入HDFS 2.2.2 导入导出半...

    HadoopLearning:大数据学习教程

    HDFS入门、深入、Shell访问、Java API操作 MapReduce入门、深入、编程基础、编程进阶、实战分析和训练 Yarn入门、原理剖解和应用场景 Hbase存储原理、RowKey设计、协处理、Shell访问、Java API访问和Hbase性能调优 ...

    Fourinone分布式并行计算四合一框架

    Fourinone(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想解决问题...

    fourinone-3.04.25

    淘宝Fourinone(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想...

    大数据-Inceptor技术白皮书.pdf

    HDFS仍然是一个高可扩展的分布式文件系统,是大数据软件栈的基 石。Map/Reduce在处理PB级别的数据时,仍然具有高容错性、高吞吐量的特点。但由于复杂的工作流通常需 要多个阶段的Map/Reduce任务,而Map/Reduce的输入...

    HBase数据模型解析和基本的表设计分析

    本文来自于网络,这篇文章将会对这些细节...HBase是一个开源可伸缩的针对海量数据存储的分布式nosql数据库,它根据GoogleBigtable数据模型来建模并构建在hadoop的hdfs存储系统之上。它和关系型数据库Mysql, Oracle等

Global site tag (gtag.js) - Google Analytics