hadoop源码分析(5hdfs数据流)

hadoop源码分析(5hdfs数据流)

ID:11579687

大小:660.42 KB

页数:33页

时间:2018-07-12

hadoop源码分析(5hdfs数据流)_第1页
hadoop源码分析(5hdfs数据流)_第2页
hadoop源码分析(5hdfs数据流)_第3页
hadoop源码分析(5hdfs数据流)_第4页
hadoop源码分析(5hdfs数据流)_第5页
资源描述:

《hadoop源码分析(5hdfs数据流)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Hadoop源码分析(5HDFS数据流)作者:张孟志日期:2013-07-30下面我们可以来开始分析DataNode上的动态行为。首先我们来分析DataXceiverServer和DataXceiver。DataNode上数据块的接受/发送并没有采用我们前面介绍的RPC机制,原因很简单,RPC是一个命令式的接口,而DataNode处理数据部分,往往是一种流式机制。DataXceiverServer和DataXceiver就是这个机制的实现。其中,DataXceiver还依赖于两个辅助类:BlockSender和BlockReceiver。下面是类图:Data

2、XceiverServer很简单,它打开一个端口,然后每接收到一个连接,就创建一个DataXceiver,服务于该连接,并记录该连接的socket,对应的实现在DataXceiverServer的run方法里。当系统关闭时,DataXceiverServer将关闭监听的socket和所有DataXceiver的socket,这样就导致了DataXceiver出错并结束线程。33DataXceiver才是真正干活的地方,目前,DataXceiver支持的操作总共有六条,分别是:OP_WRITE_BLOCK(80):写数据块OP_READ_BLOCK(81):读

3、数据块OP_READ_METADATA(82):读数据块元文件OP_REPLACE_BLOCK(83):替换一个数据块OP_COPY_BLOCK(84):拷贝一个数据块OP_BLOCK_CHECKSUM(85):读数据块检验码DataXceiver首先读取客户端的版本号并检验,然后再读取一个字节的操作码,并转入相关的子程序进行处理。下面以$HADOOP_HOME/bin/hadoopfs-put或$HADOOP_HOME/bin/hadoopfs-copyFromLocal(这两个命令是一样的)

4、命令来介绍整个写入的流程(OP_WRITE_BLOCK(80):写数据块)。客户端首先向namenode申请写入文件(这里仅讨论新写入一个文件的情况,目前Hadoop也支持append写入方式,但暂不讨论);namenode接收请求后仅在namdnode端创建一个无对应block的文件并在整个hdfs中维护;接着datanode建立以本地要上传的文件作为输入流,namenode返回的路径作为输出流,利用IOUtils.copyBytes()函数开始上传数据文件;在client准备好发送、响应的两个队列和数据的packet后,向namenode申请对应的dat

5、enodes和blocks;namenode为其分配datanodes和创建新的blocks;然后由client建立到第一个datanode的连接(默认会有3份备份)开始正式写入数据,并由每个datanode建立到下一个datanode的连接完成数据备份直到最后一个datanode;同时每个datanode接受下一个datanode写入数据是否成功的响应(ACK),并最终传给client(以上过程类似于管线),释放资源或对错误进行处理。数据流图如图所示:33步骤一:客户端通过对DistributedFileSystem对象调用create()方法来创建文件;

6、步骤二:DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件。此时该文件中没有对应的数据块;namenode执行各种检查以确保这个文件不存在,并且客户端有创建该文件的权限;步骤三:DistributedFileSystem向客户端返回一个负责处理datanode和namenode间通信的FSDataOutputStream对象,由此客户端开始写入数据。DFSOutputStream将文件分成一个个数据包,并写入称为数据队列(dataqueue)的内部队列;步骤四:DataStreamer处理数据

7、队列,根据datenode列表来要求namenode分配适合的新块来存储数据备份。一组datanode组成一条管线(pipeline)。DataStreamer将数据包流式传输到管线中的第1个datanode,再根据管线节点顺序传输数据包。步骤五:DFSOutputStream维护一个称为确认队列(ackqueue)的内部数据包队列等待datanode的收到确认回执。收到管道中所有datanode确认信息后,该数据包从确认队列删除。步骤六、步骤七:客户端完成数据的写入后,会对数据流调用close()方法。33该操作将剩余的所有数据包写入datanode管线中

8、,并在联系namenode且发送文件写入完成信号之前

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。