2020-05-21 08:57发布
一、文件的打开e79fa5e98193e59b9ee7ad94313333613133651.1、客户端HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为:public FSDataInputStream open(Path f, int bufferSize) throws IOException {return new DFSClient.DFSDataInputStream(dfs.open(getPathName(f), bufferSize, verifyChecksum, statistics));}其中dfs为DistributedFileSystem的成员变量DFSClient,其open函数被调用,其中创建一个DFSInputStream(src, buffersize, verifyChecksum)并返回。synchronized void openInfo() throws IOException {LocatedBlocks newInfo = callGetBlockLocations(namenode, src, 0, prefetchSize);this.locatedBlocks = newInfo;this.currentNode = null;}private static LocatedBlocks callGetBlockLocations(ClientProtocol namenode,String src, long start, long length) throws IOException {return namenode.getBlockLocations(src, start, length);}在DFSInputStream的构造函数中,openInfo函数被调用,其主要从namenode中得到要打开的文件所对应的blocks的信息,实现如下:LocatedBlocks主要包含一个链表的List blocks,其中每个LocatedBlock包含如下信息:· Block b:此block的信息· long offset:此block在文件中的偏移量· DatanodeInfo[] locs:此block位于哪些DataNode上上面namenode.getBlockLocations是一个RPC调用,最终调用NameNode类的getBlockLocations函数。1.2、NameNodeNameNode.getBlockLocations实现如下:
hdfs数据存储是Datanode程序负责的
最多设置5个标签!
一、文件的打开e79fa5e98193e59b9ee7ad9431333361313365
blocks,其中每个LocatedBlock包含如下信息:
1.1、客户端
HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为:
public FSDataInputStream open(Path f, int bufferSize) throws IOException {
return new DFSClient.DFSDataInputStream(
dfs.open(getPathName(f), bufferSize, verifyChecksum, statistics));
}
其中dfs为DistributedFileSystem的成员变量DFSClient,其open函数被调用,其中创建一个DFSInputStream(src, buffersize, verifyChecksum)并返回。
synchronized void openInfo() throws IOException {
LocatedBlocks newInfo = callGetBlockLocations(namenode, src, 0, prefetchSize);
this.locatedBlocks = newInfo;
this.currentNode = null;
}
private static LocatedBlocks callGetBlockLocations(ClientProtocol namenode,
String src, long start, long length) throws IOException {
return namenode.getBlockLocations(src, start, length);
}
在DFSInputStream的构造函数中,openInfo函数被调用,其主要从namenode中得到要打开的文件所对应的blocks的信息,实现如下:
LocatedBlocks主要包含一个链表的List
· Block b:此block的信息
· long offset:此block在文件中的偏移量
· DatanodeInfo[] locs:此block位于哪些DataNode上
上面namenode.getBlockLocations是一个RPC调用,最终调用NameNode类的getBlockLocations函数。
1.2、NameNode
NameNode.getBlockLocations实现如下:
相关问题推荐
hdfs数据存储是Datanode程序负责的