您好,登錄后才能下訂單哦!
這篇文章主要講解了“Hadoop中的RPC機制”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Hadoop中的RPC機制”吧!
RPC(Remote Procedure Call)—遠程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶機/服務(wù)器模式。請求程序就是一個客戶機,而服務(wù)提供程序就是一個服務(wù)器。首先,客戶機調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務(wù)進程,然后等待應(yīng)答信息。在服務(wù)器端,進程保持睡眠狀態(tài)直到調(diào)用信息的到達為止。當一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進程接收答復(fù)信息,獲得進程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進行。
Hadoop的整個體系結(jié)構(gòu)就是構(gòu)建在RPC之上的(見org.apache.hadoop.ipc包)
使用RPC: (搭建一個Hadoop偽分布式虛擬機(Server端), 本地Windows連接該虛擬機(Client端))
1. 定義RPC協(xié)議接口 LoginProtocol (Hadoop RPC協(xié)議通常是一個Java接口), RPC協(xié)議接口是Client和Server之間的通信接口, 它定義了Server對外提供的接口. LoginProtocol接口聲明了一個login()方法, 需要注意的是Hadoop中所有自定義的RPC協(xié)議接口都有一個為versionID的字段, 它描述了該協(xié)議的版本信息, 這個RPC協(xié)議接口為Client/Server共同持有, Server端, Client端都必須有同一個LoginProtocol.class文件
public interface LoginProtocol { public static final long versionID = 1L; public String login(String username, String password); }
2. 在Server端, LoginProtocolImpl 實現(xiàn)RPC協(xié)議接口( LoginProtocol )
public class LoginProtocolImpl implements LoginProtocol { @Override public String login(String username, String password) { return "wellcome " + username; } }
3. 在Server端構(gòu)造并啟動RPC Server, "192.168.8.101"是Server的ip地址, Server端監(jiān)聽了"1234"端口
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { // 設(shè)置4個必需參數(shù): // setBindAddress("192.168.8.101") : Server端的IP地址 // setPort(1234) : 端口 // setProtocol(LoginProtocol.class) : setRPC協(xié)議接口的class對象 // setInstance(new LoginProtocolImpl()) : RPC協(xié)議接口的實現(xiàn)類的實例 Server server = new RPC.Builder(new Configuration()).setBindAddress("192.168.8.101").setPort(1234) .setProtocol(LoginProtocol.class).setInstance(new LoginProtocolImpl()).build(); server.start(); } }
4. 在Client端構(gòu)造RPC客戶端, 使用RPC類靜態(tài)方法getProxy()構(gòu)造客戶端RPC代理對象( proxy ), 調(diào)用RPC代理對象( proxy )的login()方法, 發(fā)送RPC請求. "192.168.8.101"是Server的ip地址, "1234"是Server端監(jiān)聽端口
public class LoginClient { public static void main(String[] args) throws IOException { // getProxy()參數(shù): // LoginProtocol.class : RPC協(xié)議接口的class對象 // 1L : RPC協(xié)議接口的版本信息(versionID) // new InetSocketAddress("192.168.8.101", 1234) : Server端的IP地址及端口 // conf : Configuration實例 LoginProtocol proxy = RPC.getProxy(LoginProtocol.class, 1L, new InetSocketAddress("192.168.8.101", 1234), new Configuration()); String result = proxy.login("rpc", "xxx"); System.out.println(result); } }
接下來, 神奇的一幕發(fā)生了!
本地Windows的Console輸出:
wellcome rpc
本地Windows有LoginProtocol接口的實現(xiàn)嗎?
沒有喲!
感謝各位的閱讀,以上就是“Hadoop中的RPC機制”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Hadoop中的RPC機制這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。