hadoop(7)--下載數據源碼解析(上)

前面瞭解了hadoop寫文件,讀文件的執行過程,那麼hadoop內部是怎麼實現的呢?接下來看一下從hdfs中讀取文件的源碼,一塊兒來分析一下,這樣就會更加了解hdfsjava

首先將hadoop/share/common中的jar以及所依賴的lib中的jar,hadoop/share/hdfs中的jar以及所依賴的lib中的jar,導入到工程node


image.png

總共59個jar包,寫一個測試類linux

package cn.xmf.haddop;


import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.FileOutputStream;
import java.io.IOException;

/** * Created by Administrator on 2018/4/11. */
public class hdfs {
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://my01:9000/");
        FileSystem fs = FileSystem.get(conf);
        FSDataInputStream input = fs.open(new Path("/jdk-8u161-linux-x64.tar.gz"));
        FileOutputStream output = new FileOutputStream("d:/jdk8.tgz");
        IOUtils.copy(input,output);
    }
}

複製代碼

運行以後,會將以前hdfs根路徑下的jdk下載到d盤,效果以下圖apache


這個就是下載下來的

接下來重點來了將斷點打到FileSystem這一行,進入到FilegeSystem的get方法中分佈式


image.png

繼續點擊get,進去oop


image.png

向下走,會走到測試


image.png

能夠看出三目運算,執行CACHE.get(uri,conf),那麼進入到這個裏面看看ui


image.png

Cache是FileSystem的內部類,再往下看
image.png

繼續走spa


image.png

這裏就是根據scheme從SERVICE_FILE_SYSTEMS這個裏面拿出class,那麼hdfs對應對FileSystem的實例是什麼,繼續看一下3d


image.png

是DistributedFileSystem終於得到了,下面就很簡單,就是將這個class返回,那麼在獲取FileSystem的時候,實際上是根據conf中配置的fs.defaultFS來肯定的哪種FileSystem。OK到這裏剛纔第一句話的原理才分析透徹,哪一句話呢?

image.png

就是圖上的這一句話:
FileSystem fs = FileSystem.get(conf);
好了!到這裏先暫停一下,說一下這個FileSystem都有哪些實現類,剛纔的DistributedFileSystem看名字的意思就是分佈式文件系統,說白了就是hdfs的文件系統,問什麼它在命名的時候不叫HdfsFileSystem呢?緣由就是:他願意,哈哈,你能咋地,若是這個是你開發的,你能夠叫HdfsFileSystem,可是你不是,我也不是,說這麼多就是要記住DistributedFileSystem是HDFS的FileSystem。好了!看一下FileSystem都有哪些實現類
image.png

這一張圖說明他有本地文件系統,Ftp文件系統等等
繼續
image.png

從上圖能夠看出經過class反射出Fs,由於反射出來的是成員變量都是空的,因此要進行初始化,進入初始分方法


image.png

進入到DFSClient中


image.png

DFSClient中有一個屬性叫作namenode,這個就是客戶端的代理,繼續跟蹤代碼,這個是怎麼賦值的


image.png

進入到createNonHAProxy這個裏面


image.png

繼續走


image.png

這句話就是拿到代理對象
返回以後


image.png

這樣namenode就是代理的proxyInfo中的代理對象

image.png

初始化完成以後將代理對象放到DFSClient中,並將dfsClient放到FileSystem中,其實FileSystem裏面最終要的就是這個客戶端的代理對象,實際上就是namenode的代理對象,這樣才能進行從namenode中寫文件和讀文件
用一個圖說明一下這個調用過程,一目瞭然


image.png

好了,今天就分享了FileSystem fs = FileSystem.get(conf);
明天繼續講FSDataInputStream input = fs.open(new Path("/jdk-8u161-linux-x64.tar.gz"));

相關文章
相關標籤/搜索