RPC機制與hdfs下載原始碼剖析
阿新 • • 發佈:2019-01-04
這裡沒有貼出原始碼,有興趣的可以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的引用,在DFSClient中hadoop使用RPC機制得到了服務端的一個代理物件,然後對其增強返回一個新的代理物件(原代理物件的增強:代理物件的代理物件),使用jdk的動態代理對方法增強,然後將這個增強後的代理物件作為DFSClient的引用,這樣FileSystem就可以間接的獲取服務端的代理物件的引用
2.客戶端與服務端RPC通訊,客戶端將檔名傳過去,服務端查詢這個檔案的元資料資訊,然後返回給客戶端,客戶端得到元資料資訊,作為流的成員變數,這個流持有了元資料,在任何機器上都可以去下載