- 1、本文档共33页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Hadoop源码分析(5HDFS数据流)
Hadoop源码分析(5 HDFS数据流)作者:张孟志日期:2013-07-30下面我们可以来开始分析DataNode上的动态行为。首先我们来分析DataXceiverServer和DataXceiver。DataNode上数据块的接受/发送并没有采用我们前面介绍的RPC机制,原因很简单,RPC是一个命令式的接口,而DataNode处理数据部分,往往是一种流式机制。DataXceiverServer和DataXceiver就是这个机制的实现。其中,DataXceiver还依赖于两个辅助类:BlockSender和BlockReceiver。下面是类图:DataXceiverServer很简单,它打开一个端口,然后每接收到一个连接,就创建一个DataXceiver,服务于该连接,并记录该连接的socket,对应的实现在DataXceiverServer的run方法里。当系统关闭时,DataXceiverServer将关闭监听的socket和所有DataXceiver的socket,这样就导致了DataXceiver出错并结束线程。DataXceiver才是真正干活的地方,目前,DataXceiver支持的操作总共有六条,分别是:OP_WRITE_BLOCK (80):写数据块OP_READ_BLOCK (81):读数据块OP_READ_METADATA (82):读数据块元文件OP_REPLACE_BLOCK (83):替换一个数据块OP_COPY_BLOCK (84):拷贝一个数据块OP_BLOCK_CHECKSUM (85):读数据块检验码DataXceiver首先读取客户端的版本号并检验,然后再读取一个字节的操作码,并转入相关的子程序进行处理。下面以$HADOOP_HOME/bin/hadoop fs -put localsrc … dst或$HADOOP_HOME/bin/hadoop fs -copyFromLocal localsrc … dst(这两个命令是一样的)命令来介绍整个写入的流程(OP_WRITE_BLOCK (80):写数据块)。客户端首先向namenode申请写入文件(这里仅讨论新写入一个文件的情况,目前Hadoop也支持append写入方式,但暂不讨论);namenode接收请求后仅在namdnode端创建一个无对应block的文件并在整个hdfs中维护;接着datanode建立以本地要上传的文件作为输入流,namenode返回的路径作为输出流,利用IOUtils.copyBytes()函数开始上传数据文件;在client准备好发送、响应的两个队列和数据的packet后,向namenode申请对应的datenodes和blocks;namenode为其分配datanodes和创建新的blocks;然后由client建立到第一个datanode的连接(默认会有3份备份)开始正式写入数据,并由每个datanode建立到下一个datanode的连接完成数据备份直到最后一个datanode;同时每个datanode接受下一个datanode写入数据是否成功的响应(ACK),并最终传给client(以上过程类似于管线),释放资源或对错误进行处理。数据流图如图所示:步骤一:客户端通过对DistributedFileSystem对象调用create()方法来创建文件;步骤二:DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件。此时该文件中没有对应的数据块;namenode执行各种检查以确保这个文件不存在,并且客户端有创建该文件的权限;步骤三:DistributedFileSystem向客户端返回一个负责处理datanode和namenode间通信的FSDataOutputStream对象,由此客户端开始写入数据。DFSOutputStream将文件分成一个个数据包,并写入称为数据队列(data queue)的内部队列;步骤四: DataStreamer处理数据队列,根据datenode列表来要求namenode分配适合的新块来存储数据备份。一组datanode组成一条管线(pipeline)。DataStreamer将数据包流式传输到管线中的第1个datanode,再根据管线节点顺序传输数据包。步骤五:DFSOutputStream维护一个称为确认队列(ack queue)的内部数据包队列等待datanode的收到确认回执。收到管道中所有datanode确认信息后,该数据包从确认队列删除。步骤六、步骤七:客户端完成数据的写入后,会对数据流调用close()方法。该操作将剩余的所有数据包写入datanode管线中,并在联系namenode且发送文件写
文档评论(0)