• Hadoop之HDFS数据写流程和写失败的情况


    HDFS的写流程

    1. 首先客户端通过DistributedFileSystem上调用create()方法来创建一个文件。
    2. DistributedFileSystem使用RPC呼叫NameNode,让NameNode在NameSpace上创建一个没有与任何关联的新文件,并确认客户端是否拥有创建文件的权限,如果检查通过,NameNode就会为新文件生成一条记录;不然文件创建失败,客户端会抛出IOException,成功之后,DistributedFileSystem会返回一个FSDataOutputStream(其中包装了一个DFSOutputStream,DFSOutputStream,其掌握了与DataNode与NameNode的练习)给客户端。
    3. 客户端开始写数据,DFSOutputStream将文件分割成很多很小的数据,然后将每个小块放进一个个包(数据包,包中除了数据还有描述数据用的标识)中,这些包会写进一个名为数据队列(Data quence)的内部队列。
    4. 数据队列被DataStream消费,DataStream负责NameNode去挑选出适合存储块备份的DataNode的一个队列。这个列表会构成一个pipline,包流进pipline后存储在DataNode中。
    5. DFSOutputStream也会维护一个包门的内部队列,其中也会有所有的数据包,该队列等待Dataode门的写入确认,所以叫做确认队列(ack quence),当一个包被pipeline中的所有DataNode确认写入磁盘成功,这个包才会从确认队列中移除。
    6. 当客户端完成了数据写入,会在流上调用close()方法,这个行为会将所有剩下的包flush进DataNode中。
    7. 之后等待确认信息到达之后,客户端就联系NameNode告之文件数据已经放好。

    写失败的情况与解决方案

    DataNode写入数据失败

    • pipeline被关闭,在确认队列中剩下的包会被添加进数据队列的起始位置上,以至于在失败的节点下游的任何节点都不会丢失任何的包。
    • 之后与NameNode练习后,当前在一个好的DataNode会联系NameNode,给失败节点上还未写完的块生成一个新的标识ID,以至于如果这个失败的DataNode不久后恢复了,这个不完整的块会被删除。
    • 失败节点从pipeline中移除,之后剩下来好的DataNode会组成一个新的pipeline,剩下的这些块(刚刚放进数据队列队首的包)会继续写进pipeline中好的DataNode中。
    • 最后,NameNode注意到备份数小于规定的备份数,它就安排在另一个节点上创建完成备份,直接从已有的块中复制就好了。直到满足了备份数。如果有多个节点写入失败了,如果满足了最小备份数的设置,写入也将成功,之后剩下的备份会被集群异步的执行备份,直到满足了备份数。
  • 相关阅读:
    随手练——几个递归小题目
    随手练——USACO 1.44 母亲的牛奶
    随手练——汉诺塔问题(递归典型)
    Linux搭建lamp(Apache+PHP+Mysql环境)centos7.2版详细教程
    Windows 环境下安装redis 及其PHP Redis扩展
    Windows系统如何安装Redis
    phpstorm配置成sublime的代码高亮逼格风格
    phpstorm-----实现实时编辑服务器代码
    如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
    phpstorm取消自动保存,修改快捷键并标识修改的文件为星星标记
  • 原文地址:https://www.cnblogs.com/we9999/p/12404426.html
Copyright © 2020-2023  润新知