1. 程式人生 > >HADOOP-RPC機制

HADOOP-RPC機制


轉載自

一、RPC基本概念:

1、RPC,即Remote Procdure Call,中文名:遠端過程呼叫;
  (1)它允許一臺計算機程式遠端呼叫另外一臺計算機的子程式,而不用去關心底層的網路通訊細節,對我們來說是透明的。因此,它經常用於分散式網路通訊中。
   (2)Hadoop的程序間互動都是通過RPC來進行的,比如Namenode與Datanode直接,Jobtracker與Tasktracker之間等。
因此,可以說:Hadoop的執行就是建立在RPC基礎之上的。
補充:RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。


2、RPC的顯著特點
  (1)透明性:遠端呼叫其他機器上的程式,對使用者來說就像是呼叫本地方法一樣;
  (2)高效能:RPC Server能夠併發處理多個來自Client的請求;
  (3)可控性:jdk中已經提供了一個RPC框架—RMI,但是該PRC框架過於重量級並且可控之處比較少,所以Hadoop RPC實現了自定義的PRC框架。
3、RPC的基本流程
   (1)RPC採用了C/S的模式;
  (2)Client端傳送一個帶有引數的請求資訊到Server;
  (3)Server接收到這個請求以後,根據傳送過來的引數呼叫相應的程式,然後把自己計算好的結果傳送給Client端;

  (4)Client端接收到結果後繼續執行;
4、 Hadoop中的RPC機制
  同其他RPC框架一樣,Hadoop RPC分為四個部分:
  (1)序列化層:Clent與Server端通訊傳遞的資訊採用了Hadoop裡提供的序列化類或自定義的Writable型別;
  (2)函式呼叫層:Hadoop RPC通過動態代理以及java反射實現函式呼叫;
  (3)網路傳輸層:Hadoop RPC採用了基於TCP/IP的socket機制;
  (4)伺服器端框架層:RPC Server利用java NIO以及採用了事件驅動的I/O模型,提高RPC Server的併發處理能力;
  Hadoop RPC在整個Hadoop中應用非常廣泛,Client、DataNode、NameNode之間的通訊全靠它了
。例如:我們平時操作HDFS的時候,使用的是FileSystem類,它的內部有個DFSClient物件,這個物件負責與NameNode打交道。在執行時,DFSClient在本地建立一個NameNode的代理,然後就操作這個代理,這個代理就會通過網路,遠端呼叫到NameNode的方法,也能返回值。

二、RPC使用:

1、建立介面,該介面類在服務端和客戶端都必須有。介面必須繼承VersionedProtocol

public interface Serverif extends VersionedProtocol

2、在服務端實現介面類

public class ServerImpl implements Serverif

3、服務端,使用實現的類啟動服務,需要定義監聽的IP地址和埠

Server server = RPC.getServer(si, SERVERADDRESS, SERVERPORT, 10, true, conf);

server.start();

4、客戶端定義遠端連線

InetSocketAddress sa = new InetSocketAddress(SERVERADDRESS, SERVERPORT);

5、客戶端使用遠端連線,通過介面定義,呼叫服務端具體實現

Serverif si = (Serverif) RPC.getProxy(Serverif.class, versionID, sa, conf);

return si.method(args);

三、例項:

1、介面

package rpc;  
import org.apache.hadoop.ipc.VersionedProtocol;  
public interface IMyBiz extends VersionedProtocol{  
    public Long VERSION = 123L;  
    public String sayHello(String str);  
}  
}2、實現:

package rpc;  
import java.io.IOException;  
public class MyBiz implements IMyBiz {  
    public String sayHello(String str) {  
        return "hello"+str;  
    }  
    @Override  
    public long getProtocolVersion(String s, long l) throws IOException {  
        // TODO Auto-generated method stub  
        return VERSION;  
    }  
}  
3、服務:

package rpc;  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.ipc.RPC;  
import org.apache.hadoop.ipc.RPC.Server;  
public class MyServer {  
    public static final String HOSTNAME = "localhost";  
    public static final int PORT = 12345;  
    /** 
     * @param args 
     * @throws Exception  
     */  
    public static void main(String[] args) throws Exception {  
        Configuration con = new Configuration();  
        Server server = RPC.getServer(new MyBiz(), HOSTNAME, PORT, con);  
        server.start();  
    }  
}  
4、客戶端:

package rpc;  
import java.net.InetSocketAddress;  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.ipc.RPC;  
public class MyClient {  
    /** 
     * @param args 
     * @throws Exception  
     */  
    public static void main(String[] args) throws Exception {  
        InetSocketAddress addr = new InetSocketAddress("localhost",12345);  
        IMyBiz proxy = (IMyBiz)RPC.waitForProxy(IMyBiz.class, IMyBiz.VERSION, addr, new Configuration());  
        String str = proxy.sayHello("word");  
        System.out.println("客戶端輸出:"+str);  
        RPC.stopProxy(proxy);  
    }  
}  


轉載自