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之間的通訊全靠它了
二、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);
}
}
轉載自