博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop文件写入详细剖析(22)
阅读量:5879 次
发布时间:2019-06-19

本文共 1440 字,大约阅读时间需要 4 分钟。

hot3.png

210636_55wv_1455021.png

            客户端通过对DistibutedFileSystem对象调用create()函数来创建文件(步骤1).DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件,此时该文件中还没有相应的数据块(步骤2)。namenode执行各种不同的检查以确保个文件不存在,并且客户端有创建该文件的权限。如果这些检查均通过,namenode就会创建新文件记录一条记录;否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。就像读取事件一样,FSDataOutputStream封装一个DFSOutputStream对象,该对象负责处理datanode和namenode之间的通信。

                在客户端写入数据时(步骤3),DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为“数据队列”(data queue).DataStream处理数据列表,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据备份。这一组datanode构成一个管线----我们假设复本数为3,所以管线中有3个节点.DataStreamer将数据包流式传输到管线中第一个datanode,该datanode存储数据包并将它发送到管线中的第2个datanode。同样地,第2个datanode存储该数据包并且发送给管线中的第3个(也就是最后一个)datanode(步骤4).DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,称为”确认队列“(ack queue).当收到管道中所有datanode确认信息后,该数据包才会从确认队列删除(步骤5)。

                如果在数据写入期间,datanode发生故障,则执行以下操作,这对于写入数据的客户端是透明的,首先关闭管线,确认把队列中的任何数据包都添加回数据队列的最前端,以确认故障节点下游的datanode不会漏掉任何一个数据包。为存储在另一正常datanode的当前数据块指定一个新的标识,并将该标识传送给namenode,以便datanode在恢复后可以删除存储的部分数据块。从管线中删除故障数据节点并且把余下的数据块写入管线中的两个正常的datanode。namenode注意到块复本量不足时,会在另一个节点创建一个新的复本。后续的数据块继续正常接受处理。

                在一个块被写入期间可能会有多个datanode同时发生故障,但非常少见,只要写入了dfs.replication.min的复本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication的默认值为3)。客户端完成数据的写入后,会对数据流调用close()方法(步骤6),该操作将剩余的所有数据包写入datanode管线中,并在联系namenode且发送文件写入完成信号之前,等待确认(步骤7),namenode已经知道文件由哪些块组成(通过DataStreamer询问数据库的分配),所以它在返回成功前只需要等待数据块进行最小量的复制。

                                                                                                                                    Name:Xr

                                                                                                                                    Date:2014-03-09 21:28

转载于:https://my.oschina.net/Xiao629/blog/206658

你可能感兴趣的文章
PHP 程序员的技术成长规划
查看>>
memcached 分布式聚类算法
查看>>
jquery css3问卷答题卡翻页动画效果
查看>>
$digest already in progress 解决办法——续
查看>>
虚拟机 centos设置代理上网
查看>>
Struts2中Date日期转换的问题
查看>>
mysql 数据类型
查看>>
Ubuntu 设置当前用户sudo免密码
查看>>
设置tomcat远程debug
查看>>
android 电池(一):锂电池基本原理篇【转】
查看>>
Total Command 常用快捷键
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
Xcode全局替换内容,一键Replace
查看>>
1000 加密算法
查看>>
exif_imagetype() 函数在linux下的php中不存在
查看>>
Ruby的case语句
查看>>
Linux的链接文件-ln命令
查看>>
maven的tomcat插件如何进行debug调试
查看>>
table表头固定
查看>>