hadoop(8)--下载数据源码解析(下)
2018-04-16 本文已影响51人
ROCK_杰哥
在这里说声sorry,由于最近事情很杂,所以更新的有些慢,请读者们多担待
下载数据中还有一句:
FSDataInputStream input = fs.open(new Path("/jdk-8u161-linux-x64.tar.gz"));
今天就这一句话进行源码的剖析
首先看到fs.open(),肯定是执行了DistributedFileSystem的open方法,这一点是毋庸置疑的,那么分析一下,一个输入流,jdk文件,因为jdk文件存到hdfs上是以切片的block形式存在,block又在DataNode上存着,所以肯定是通过DistributedFileSystem的namenode客户端拿到了block的位置信息,再通过RPC远程调用拿到NameNode的输入流,这样是想的清楚,那么来看看源码是不是这样的
![](https://img.haomeiwen.com/i11278345/146332741d8cf340.png)
进入到DistributedFileSystem的open方法
![](https://img.haomeiwen.com/i11278345/2e29ad071891fcf8.png)
这里最重要的就是这一句话,这一句话返回了FSDataInputStream
继续进去看
![](https://img.haomeiwen.com/i11278345/f50defb612290b0b.png)
调的是
![](https://img.haomeiwen.com/i11278345/457bc7c891341073.png)
这里是关键,将自己作为参数传进去,这是DFSClient
![](https://img.haomeiwen.com/i11278345/0b5dcc3801acfe4a.png)
这个就是DFSInputStream的构造方法,重点就是这个openInfo()
![](https://img.haomeiwen.com/i11278345/6aea6251134c9195.png)
这一句话就是openInfo的重点
进去看一下
![](https://img.haomeiwen.com/i11278345/cfeee7355475d7f8.png)
这里看到了曙光
LocatedBlocks这就就是blocks的位置信息
OK!下载数据的源码分析就到这里,下次分享MapReduce