HDFS读写-源码调用逻辑梳理

FileSystem fileSystem = FileSystem.get(new Configuration());
FSDataInputStream fsDataInputStream = fileSystem.open(fileStatus.getPath());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream));

1、调用FileSystem的open方法,根据继承关系实际调用到DistributedFileSystem的open方法,这一步和后一步实际是为获取信息。

2、DFSClient向NameNode请求block位置信息,NameNode返回的block位置信息按照网络拓扑距离由近到远排序,流包装为DFSInputStream。

3、DFSClient根据NameNode返回的信息和DataNode建立连接并打开DataInputStream输入流供读取。

4、客户端和DataNode进行交互,持续按块读取输入流直到读取完成。

open的调用关系

在我们使用的时候,只需要上边两行代码即可,实际执行时的调用过程如下

org.apache.hadoop.fs.FileSystem ---> open()

然后调用到DistributedFileSystem的open实现

public FSDataInputStream open(Path f, final int bufferSize)
    throws IOException {
   
  statistics.incrementReadOps(1);
  Path absF = fixRelativePart(f);
  return new FileSystemLinkResolver<FSDataInputStream>() {
   
    @Override
    public FSDataInputStream doCall(final Path p)
        throws IOException, UnresolvedLinkException {
   
      // 这里的dfs是一个DFSClient客户端,也就是说由一个DFS客户端来执行打开操作
      final DFSInputStream dfsis =
        dfs.open(getPathName(p), bufferSize, verifyChecksum);
      // 一个DFSInputStream的包装流
      return dfs.createWrappedInputStream(dfsis);
    }
    @Override
    public FSDataInputStream next(final FileSystem fs, final Path p)
        throws IOException {
   
      return fs.open(p, bufferSize);
    }
  }.resolve(this, absF)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值