在分佈式應用程序中使用Hadoop IPC/RPC
原文地址:http://www.supermind.org/blog/520/using-hadoop-ipcrpc-for-distributed-applications
本文來自於:http://gpcuster.cnblogs.com
譯文:
關於Hadoop IPC
我們一起來了解Hadoop IPC,這是一個內進程間通信(Inter-Process Communication)的子系統。Hadoop IPC被用於在一個進程的程序與另一個進程的程序進行通信
Hadoop IPC
1.與SOAP和XML-RPC不同,Hadoop IPC使用java中的DataOutputStream與DataInputStream進行二進制的序列化。
2. 它是一個簡潔的,低消耗的RPC機制。
3. 它只支持單播的操作。
爲什麼Hadoop的IPC實現不使用RMI或者是java.io.Serialization呢? 理由摘自what Doug has to say:
在我們開啓Hadoop項目的時候,爲什麼不使用Serialization?因爲當我們需要對對象進行精確的讀和寫操作時,這麼做對似乎過於笨重了。
不適用RMI的理由是類似的。有效的IPC對於Hadoop來說是至關重要的。我覺得我們需要精確控制這些事情,比如連接,超時,緩存等等。而RMI就達不到這些需求。
示例代碼
現在,我們一起來看看Hadoop IPC的示例代碼,看看他們究竟是如何工作的。
一般來說,所有的單播PRC調用都會包含一個客戶端和一個服務端。
創建一個服務端,
Configuration conf = new Configuration();
Server server = RPC.getServer(this, "localhost", 16000, conf); // start a server on localhost:16000
server.start();
創建一個客戶端,
Configuration conf = new Configuration();
InetSocketAddress addr = new InetSocketAddress("localhost", 16000); // the server's inetsocketaddress
ClientProtocol client = (ClientProtocol) RPC.waitForProxy(ClientProtocol.class,
ClientProtocol.versionID, addr, conf);
在這個示例中,服務端的class實現了ClientProtocol接口,ClientProtocol.java代碼看上去是這個樣子的:
interface ClientProtocol extends org.apache.hadoop.ipc.VersionedProtocol {
public static final long versionID = 1L;
HeartbeatResponse heartbeat();
}
ClientProtocol接口中只定義了一個方法:heartbeat() ,這個方法將返回一個HeartbeatResponse對象。遠程的客戶端通過週期性地調用heartbeat()方法讓服務端了解客戶端的情況。然後服務端返回一個HeartbeatResponse對象,是的客戶端獲得相應的信息。
一個HeartbeatResponse.java代碼看起來是這個樣子的:
public class HeartbeatResponse implements org.apache.hadoop.io.Writable {
String status;
public void write(DataOutput out) throws IOException {
UTF8.writeString(out, status);
}
public void readFields(DataInput in) throws IOException {
this.status = UTF8.readString(in);
}
}
總結
對於Hadoop IPC的總結如下:
1. 服務端實現了ClientProtocol接口。
2. 一個或多個客戶端將調用ClientProtocol接口的方法。
3. 在ClientProtocol接口的方法中所使用的所有參數或對象都需要繼承於org.apache.hadoop.io。