HDFS上传与下载底层实现------>源码分析

来源:互联网 发布:怎么在淘宝上投诉店铺 编辑:程序博客网 时间:2024/05/04 19:17

一 、 java实现下载回顾


二 、原理解析

1. FileSystem.get(conf)解析


FileSystem.get(conf)  //得到文件系统FileSystem的实例

------>
get(conf){
get(url,conf) //调用内部的get(url,conf)方法
}

------>
get(url,conf){
CACHE.get(url,conf) //调用内部的CACHE.get(url,conf)方法
}

------>
CACHE.get(url,conf) {
  getInternal(url,conf,key){
    fs = map.get(key)  //通过map中的key得到fs的实例,map是新建的集合,所以第一次肯定拿不到 
    fs = createFileSystem(url,conf) //于是自己创建了一个
  }
}

------>
createFileSystem(URL url,Configuration conf){
  clazz = getClazz() //拿到DistrubutedFileSystem的clazz
  Filesystem fs = (Filesystem)ReflectionUtils.newInstance(clazz,conf) //通过clazz反射得到Filesystem的实例
  fs.initialize(url,conf) //由于反射得到,所以成员变量还没有进行初始化,所以调用initialize方法进行初始化
  return fs
}

------>
//来到了DistributeFileSystem这个类
DistributeFileSystem{
 DFSClient dfs;

 void initialize(URL url,Configuration conf){
  this.dfs = new DFSClient(url,conf,statistics)//调用initail方法进行初始化,new DFSClient,

                                                                         //将Dfsclient作为distributFilesystem成员变量
 } 
}

------>
//来到了DFSClient这个类
DFSClient{
  ClientProtocal namenode;
  DFSClient(nameNodeuri,rocNamenode,conf,stats){
     proxyInfo = NameNodeProxies.createProxyWithLossyRetryHadler(conf,nameNodeuri,
                              ClientProtocal.class,nuResponseToDrop) //用RPC框架工具创建一个与NN通信用的客户端代理对象

     this.namenode = proxyInfo.getProxy();  //将客户端代理对象作为DFSClient的成员变量
  }
}


2.DFSInuptStream fs = fs.open(new Path("/1.txt"));解析


//实际上调用DistributedFileSystem的open方法
DistributedFileSystem{
  DFSClient dfs;

  dfs.open(path){
    return new DFSInputStream(this,src,buffersize,verifyChecksum)  
  }
}

------>DFSInputStream给各种成员赋值
DFSInputStream(this,src,buffersize,verifyChecksum){
   private dfsClient = this
   private src = src
   .......
   private locateBlocks  //对locateBlocks的赋值在openInfo方法中完成
   private blockReader   //对blockReader的赋值在openInfo方法中完成
   openInfo(); //调用openInfo方法,对locatedBlocks赋值
}

------>
openInfo(){
  ......
  lastBlockBeingWrittenLength = fetchLocatedBlocksAndGetLastBlockLength();//得到块的位置信息和最后一块的大小,
                                                                          //并对locateBlocks进行赋值  
}

------>
fetchLocatedBlocksAndGetLastBlockLength(){
  final LocatedBlocks newInfo = dfsclient.getLocatedBlocks(src,0) //调用 getLocatedBlocks()方法,得到NN块的信息
}
......
------>
static LocatedBlocks callGetBlockLocations(ClientProtocol namenode,String src,long start,long length){
  return namenode.getBlockLocations(src,start,length)  //得到NN块的信息
}

3.

FileOutputStream out = new FileOutputStream("D:/hadoop_test/1"); //new FileOutputStream本地输出流
4.IOUtils.copyBytes(in,out,4096,true);  //进行下载操作


0 0
原创粉丝点击