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); //进行下载操作
- HDFS上传与下载底层实现------>源码分析
- epoll 底层实现源码分析
- hdfs上传文件的源码分析
- 代码实现HDFS数据上传和下载
- RPC机制与hdfs下载源码剖析
- OKHttp源码分析3 - HttpEngine底层实现
- 【hadoop】 2006-hdfs源码分析下载初始化、下载过程
- Eclipse 上传 删除 下载 分析 hdfs 上的文件
- netty源码分析(十六)Channel选择器工厂与轮询算法及注册底层实现
- HDFS 使用java api实现上传/下载/删除文件
- HDFS 使用Java api实现上传/下载/删除文件
- HashMap底层源码分析
- EventBus源码底层分析
- Hash底层源码分析
- flex实现上传与下载
- hdfs源码分析思路
- Hadoop源码分析-HDFS
- HDFS namenode源码分析
- 接口中的方法
- selenium+python3-数据驱动测试示例
- 一、简单工厂模式
- 全排列拓扑排序
- Python 字典(Dictionary)
- HDFS上传与下载底层实现------>源码分析
- Gabor滤波器为什么能实现频率域加窗
- 用map做桶
- Sciter:创建Hello World
- ROS中的编译问题 "catkin_make" must be invoked in the root of workspace
- IsPostBack
- [读书笔记]程序员的自我修养 chp9
- 第三章 方法和作用域
- getElementsByClassName函数实现获取指定类名的子元素列表