《HDFS 5》--BlockLocation的源码分析、HDFS的回顾


【BlockLocation的源码】

Client-->fs.getFileBlockLocations(stat, 0, stat.getLen());

      -->【DistributedFileSystem.class】getFileBlockLocations(FileStatus file, long start,long len)
        -->【DistributedFileSystem.class】getFileBlockLocations(Path p,final long start, final long len)
      -->调用new FileSystemLinkResolver<BlockLocation[]>(),
           创建匿名内部类,重写doCall方法
      -->调用doCall方法
        -->【DFSClient.class】getBlockLocations(String src, long start,long length)
              说明:DFSClient可以连接到Hadoop文件系统并执行基本的文件任务。
                         它使用clientprotocol与NameNode守护进程通信,
                         并直接连接到datanode来读取/写入数据块
              -->【DFSClient.class】getLocatedBlocks(String src, long start, long length)
            -->【DFSClient.class】callGetBlockLocations(ClientProtocol namenode,String src, long start, long length) 
           {
            return namenode.getBlockLocations(src, start, length);
           }
           -->[ClientNamenodeProtocolTranslatorPB]getBlockLocations(String src, long offset, long length)
              {
               try {
                 //客户端通过rpc协议与namenode通信,获取内存中的块映射信息等
                 GetBlockLocationsResponseProto resp = rpcProxy.getBlockLocations(null,req);
                 return resp.hasLocations() ?  PBHelper.convert(resp.getLocations()) : null;
               } catch (ServiceException e) {
                 throw ProtobufHelper.getRemoteException(e);
               }
              }
          -->【FileSystemLinkResolver】resolve()
          说明:尝试使用指定文件系统和调用重写doCall(Path)方法。
                如果调用失败,它将尝试解析路径并重试调用

 
 
       

【说明:下面的信息是GetBlockLocationsResponseProto类对象resp封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值