Hadoop的RPC框架
阿新 • • 發佈:2018-12-16
專案一:作為服務端:
ClientNamenodeProtocol 這是一個介面,相當於是呼叫RPC之間的協議
package com.thp.bigdata.protocol;
public interface ClientNamenodeProtocol {
public static final long versionID = 1L; // 會讀取這個版本號,可以和客戶端的不一樣, 沒有校驗
public String getMetaData(String path);
}
MyNameNode : 是實現類:
package com.thp.bigdata.server; import com.thp.bigdata.protocol.ClientNamenodeProtocol; public class MyNameNode implements ClientNamenodeProtocol { // 模擬namenode的業務方法之一:查詢元資料 @Override public String getMetaData(String path) { return path + " 3- {BLK_1,BLK_2} ... "; } }
PublishServiceUtil 服務端的啟動程式:
package com.thp.bigdata.start; import java.io.IOException; import org.apache.hadoop.HadoopIllegalArgumentException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Builder; import org.apache.hadoop.ipc.RPC.Server; import com.thp.bigdata.protocol.ClientNamenodeProtocol; import com.thp.bigdata.server.MyNameNode; /** * 啟動rpc的服務端 * @author 湯小萌 * */ public class PublishServiceUtil { public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { Builder builder = new RPC.Builder(new Configuration()); builder.setBindAddress("localhost") .setPort(8888) .setProtocol(ClientNamenodeProtocol.class) .setInstance(new MyNameNode()); Server server = builder.build(); server.start(); } }
服務端工程:
ClientNamenodeProtocol 這個介面就是協議,是跟服務端工程的介面完全一致,包名也要一樣. MyHdfsClient 是 客戶端啟動的程式:
package com.thp.bigdata.client; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import com.thp.bigdata.protocol.ClientNamenodeProtocol; public class MyHdfsClient { public static void main(String[] args) throws IOException { ClientNamenodeProtocol namenodeProxy = RPC.getProxy(ClientNamenodeProtocol.class, 1L, new InetSocketAddress("localhost",8888), new Configuration()); System.out.println("=================="); System.out.println(namenodeProxy.getClass()); System.out.println("=================="); String metaData = namenodeProxy.getMetaData("/llp.txt"); System.out.println("呼叫RPC返回的資料 : " + metaData); } }
返回的namenodeProxy 其實是RPC框架生成的一個代理物件,當客戶端需要呼叫服務端的方法時,服務端會更新實現類生成一個物件然後傳輸給客戶端.