HDFS的文件操作流(1)——写操作(客户端概述)
来源:互联网 发布:淘宝怎么开通全球购 编辑:程序博客网 时间:2024/05/16 07:20
熟悉HDFS的人可能知道,当我们调用DistributedFileSystem的create方法时,将会返回一个FSDataOutputStream对象,通过这个对象来对文件进行数据的写入。还是贴一张该对象的类图吧!
现在,我们以调用FSDataOutputStream的write(byte[],int,int)为例来看看HDFS是如何完成文件的数据写入操作的。先see一下这个过程的序列图:
从上图中,我们可以很容易的看出,文件的写入操作,关键是是要看DFSOutputSream,所以,下面我将详细的讨论DFSOutputSream类。
当创建一个DFSOutputSream实例的时候,它会首先根据设置的一个packet的大小和一个校验块的大小来计算一个packet应该包含多少个校验块(数据块+加校验和)以及这个packet的实际大小。源代码如下:
其中,原始的packet的大小来自配置文件中参数dfs.write.packet.size的设置,校验数据块的大小来自配置文件中参数io.bytes.per.checksum的设置。然后调用ClientProtocol的create远程方法,最后启动线程DataStreamer。整个创建过程的源代码如下:
现在,一切问题就都纠结在DataStream到底是个啥东东,究竟干了些神马勾当才能和DataNode节点联系起来呢?
实际上,在DataStream中,它总是不停的从packet队列中取出待发送的packet给DataNode节点,当然在这个过程中,它要不断地向NameNode节点申请Blocks,即:当没有Block或申请的一个Block已满时,它会调用ClientProtocol的addBlock远程方法得到一个LocatedBlock,也就是要知道它应该要把这个Block的packet发送到那些DataNode节点上。当然,HDFS对于Block的副本copy采用的是流水线作业的方式:client把数据Block只传给一个DataNode,这个DataNode收到Block之后,传给下一个DataNode,依次类推,...,最后一个DataNode就不需要下传数据Block了。噢,当DataStream把一个Block的所有Packet传送完毕之后,必须要等待所有的Packet被ack之后才能重新申请新的Block来传送后面的packet。
- HDFS的文件操作流(1)——写操作(客户端概述)
- HDFS的文件操作流(3)——写操作(客户端)
- hadoop源码 - HDFS的文件操作流 写操作(客户端)
- HDFS写操作的整体流程概述
- HDFS的文件操作流(4)——写操作(数据节点)
- HDFS的文件操作流(5)——写操作(NameNode节点)
- HDFS的文件操作流(2)——读操作
- 客户端对HDFS的操作
- HDFS的文件操作
- 对HDFS文件系统文件的读、写、删操作
- 对HDFS文件系统文件的读、写、删操作
- 对HDFS文件系统文件的读、写、删操作 .
- HDFS的API调用,创建Maven工程,创建一个非Maven工程,HDFS客户端操作数据代码示例,文件方式操作和流式操作
- 操作hdfs里的文件
- hdfs文件的操作常用命令
- HDFS下的文件操作
- 远程HDFS文件的操作
- hdfs——hadoop文件读写操作
- cocos2d - 粒子系统(Particle Designer)
- datagrid 遮罩
- 研一
- Map.Entry的好处
- Linux文件编程之【系统调用】——read()
- HDFS的文件操作流(1)——写操作(客户端概述)
- Windows CE 黑客必备工具总结(献给想进入Windows CE平台底层研发的朋友们) .
- ARM指令机器码学习——反汇编必学(作者:wogoyixikexie@gliet)
- 【学习笔记】字符串的使用,@ split trim stringbuilder
- php 5.3.5 安装
- 反汇编stepldr.exe——第一次使用IDA反汇编(作者:wogoyixikexie@gliet)
- Linux文件编程之【系统调用】——write()
- 老工程如何将ARC开启的问题
- 微软官方dllcache恢复的批处理