我们在hdfsOpenFile中看到,根据flags的不同,libhdfs会分别调用open、create、append函数,我们接下来再分析一下他们的流程
Filesystem::open的流程如下:
1. Filesystem::open是一个抽象方法,它的实际实现是在DistributedFileSystem::open中
public FSDataInputStream open(Path f, int bufferSize) throws IOException {
return new DFSClient.DFSDataInputStream(
dfs.open(getPathName(f), bufferSize, verifyChecksum, statistics));
}
2. DistributedFileSystem::open方法实际是调用DFSClient::open方法
DFSInputStream open(String src, int buffersize, boolean verifyChecksum,
FileSystem.Statistics stats
) throws IOException {
checkOpen();
// Get block info from namenode
return new DFSInputStream(src, buffersize, verifyChecksum);
}
它先检查DFSClient是否已经打开,然后构造一个DFSInputStream对象
3. 在DFSInputStream的构造函数中,客户端向namenode请求打开文件的块列表,默认