前言:
本篇文章主要回答了如下问题:
① HDFS客户端写数据时怎么界定一个DFSPacket对象是此block里的最后一个DFSPacket?
② DFSPacket对象里的lastPacketInblock何时设置为true的?
一、前置补充知识:
使用过HDFS API创建新文件,然后向这个新文件写数据的朋友一定知道。创建文件(create)的API会给我们返回一个输出流。参考下图,是 org.apache.hadoop.fs. FileSystem
类给我们定义的创建文件的API及其部分重载函数。
我们拿到这个输出流之后,调用write相关的方法往里面写数据,最后close流。就完成了整个创建、写入的全过程。
那其实在调用write相关方法后,HDFS Client帮我们封装了很多细节。这里简单提一些本文中会用到的概念:
- DataStreamer :负责向pipeline里的datanodes发送数据包。调用输出流的write方法会把数据放到DataStreamer的dataQueue这个链表数据结构里。
- DFSPacket : 即DataStreamer发送的数据包对象 。
- ResponseProcessor:相应处理器线程,用于处理DFSPacket的响应ack信息。直白点讲就是:我把数据发出去了,我得知道它的状态,发送成功了还是发送失败了。
二、DFSPacket对象简要介绍
DFSPacket有如下这些成员变量:
网友评论