1. 程式人生 > >RPC機制與hdfs下載原始碼剖析

RPC機制與hdfs下載原始碼剖析

這裡沒有貼出原始碼,有興趣的可以debug跟蹤然後根據我的原始碼描述,看懂hdfs是怎麼下載檔案的

1.RPC機制

介面代理:

public interface Businesable{

public static final long versionID= 10010;

public String sayHello(String name);

}

versionID:代表服務端的版本號,此時客戶端呼叫服務端方法的時候,必須比對此版本號

服務端:

//建立一個服務,配置必要的設定:設定服務端的例項,遵循的協議(客戶端要呼叫服務端的方法,需要得到服務端的代理物件,這裡使用介面代理)、地址和埠

Server server = new RPC.Builder(new Configuration())

.setInstance(new RPCServer()).setProtocol(Businesable.class)

.setBindAddress("192.168.92.88").setPort(10000).build();

server.start();

客戶端:
Businesable proxy = RPC.getProxy(Businesable.class,10010, new InetSocketAddress("192.168.92.88",10000), new Configuration());

String name = proxy.sayHello(args[0]);

System.out.print(name);

客戶端可以打jar包。windows系統上可以執行jar,傳入引數即可呼叫服務端

java-jar RPCClient.jartom:這裡傳入引數為tom,值得注意的是:在另一臺主機呼叫時,jdk版本不得高於服務端。否則會出現高版本的jdk在低版本的jvm執行的異常

下載原始碼剖析

1.首先找到預設的hdfs配置檔案,找到實現類DistributedFileSystem,利用反射初始化這個物件

,然後呼叫初始化方法(initailize),初始化其他物件,其中有一個物件為DFSClient,然後將其作為distributedFileSystem的成員變數,distributedFileSystem

這樣就持有了DFSClient的引用,在DFSClienthadoop使用RPC機制得到了服務端的一個代理物件,然後對其增強返回一個新的代理物件(原代理物件的增強:代理物件的代理物件),使用jdk的動態代理對方法增強,然後將這個增強後的代理物件作為DFSClient的引用,這樣FileSystem就可以間接的獲取服務端的代理物件的引用

2.客戶端與服務端RPC通訊,客戶端將檔名傳過去,服務端查詢這個檔案的元資料資訊,然後返回給客戶端,客戶端得到元資料資訊,作為流的成員變數,這個流持有了元資料,在任何機器上都可以去下載