前面瞭解了hadoop寫文件,讀文件的執行過程,那麼hadoop內部是怎麼實現的呢?接下來看一下從hdfs中讀取文件的源碼,一塊兒來分析一下,這樣就會更加了解hdfsjava
首先將hadoop/share/common中的jar以及所依賴的lib中的jar,hadoop/share/hdfs中的jar以及所依賴的lib中的jar,導入到工程node
總共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方法中分佈式
繼續點擊get,進去oop
向下走,會走到測試
能夠看出三目運算,執行CACHE.get(uri,conf),那麼進入到這個裏面看看ui
繼續走spa
這裏就是根據scheme從SERVICE_FILE_SYSTEMS這個裏面拿出class,那麼hdfs對應對FileSystem的實例是什麼,繼續看一下3d
是DistributedFileSystem終於得到了,下面就很簡單,就是將這個class返回,那麼在獲取FileSystem的時候,實際上是根據conf中配置的fs.defaultFS來肯定的哪種FileSystem。OK到這裏剛纔第一句話的原理才分析透徹,哪一句話呢?
FileSystem fs = FileSystem.get(conf);
從上圖能夠看出經過class反射出Fs,由於反射出來的是成員變量都是空的,因此要進行初始化,進入初始分方法
進入到DFSClient中
DFSClient中有一個屬性叫作namenode,這個就是客戶端的代理,繼續跟蹤代碼,這個是怎麼賦值的
進入到createNonHAProxy這個裏面
繼續走
這句話就是拿到代理對象
返回以後
這樣namenode就是代理的proxyInfo中的代理對象
初始化完成以後將代理對象放到DFSClient中,並將dfsClient放到FileSystem中,其實FileSystem裏面最終要的就是這個客戶端的代理對象,實際上就是namenode的代理對象,這樣才能進行從namenode中寫文件和讀文件
用一個圖說明一下這個調用過程,一目瞭然
好了,今天就分享了FileSystem fs = FileSystem.get(conf);
明天繼續講FSDataInputStream input = fs.open(new Path("/jdk-8u161-linux-x64.tar.gz"));