第一部分: hadoop rpc基礎
RPC,遠程程序調用,分布式計算中C/S模型的一個應用實例。
同其他RPC框架一樣,Hadoop分為四個部分:
- 序列化層:支持多種框架實現序列化與反序列化
- 函數調用層:利用java反射與動態代理實現
- 網絡傳輸層:基於TCP/IP的Socket機制
- 服務的處理框架:基於Reactor模式的事件驅動IO模型
Hadoop RPC主要對外提供2種接口
public static ProtocolProxy getProxy/waitForProxy:
構造一個客戶端代理對象,向服務器發送RPC請求
public static Server RPC.Builder(Configuration).build(…):
為某個協議實例構造一個服務器對象,用於處理客戶端發送請求。
如何使用Hadoop RPC?
其實很簡單,按照下面四步即可完成高性能CS網絡模型
1.定義RPC協議
2.實現RPC協議
3.構造和啟動RPC SERVER
4.構造RPC Client並發送請求
下面是代碼實例, 依賴hadoop-common-版本.jar
1.定義RPC協議
hadoop中所有自定義RPC接口都必須繼承VersionedProtocol接口
package myrpc;
import org.apache.hadoop.ipc.VersionedProtocol;
/** * Created by ywszjut on 14-8-22. */ public interface ClientProtocol extends VersionedProtocol { public static final long versionID=1L; String echo(String value); } |
2.實現協議
package myrpc;
import org.apache.hadoop.ipc.ProtocolSignature;
import java.io.IOException;
/** * Created by ywszjut on 14-8-22. */ public class ClientProtocolImpl implements ClientProtocol { @Override public String echo(String value) { return "hello "+value; }
@Override public long getProtocolVersion(String s, long l) throws IOException { return ClientProtocol.versionID; }
@Override public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException { return new ProtocolSignature(ClientProtocol.versionID,null); } }
|
3.構造和啟動RPC SERVER
package myrpc;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Server;
import java.io.IOException;
/** * Created by ywszjut on 14-8-22. */ public class MyRpcServer {
public static void main(String[] args) throws IOException { Server server = new RPC.Builder(new Configuration()).setProtocol(ClientProtocol.class) .setInstance(new ClientProtocolImpl()).setBindAddress("127.0.0.1").setPort(8787) .setNumHandlers(5).build(); server.start(); } }
|
4.構造客戶端並發送請求
package myrpc;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC;
import java.io.IOException; import java.net.InetSocketAddress;
/** * Hello world! */ public class Client { public static void main(String[] args) throws IOException {
ClientProtocol proxy = (ClientProtocol) RPC.getProxy(ClientProtocol.class,ClientProtocol.versionID,new InetSocketAddress("127.0.0.1",8787),new Configuration());
String result = proxy.echo("123");
System.out.println(result); } }
|
測試的時候,先啟動3,再啟動4,你會發現控制台打出了hello 123
好,既然hello world 搞完, 開始學習RPC類的具體實現