前言:
本篇文章主要回答了如下问题:
① 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 : 即DataStreame