自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hadoop RPC遠(yuǎn)程過(guò)程調(diào)用源碼解析及實(shí)例

大數(shù)據(jù) Hadoop
RPC(Remote Procedure Call)遠(yuǎn)程過(guò)程調(diào)用,它允許一臺(tái)計(jì)算機(jī)程序遠(yuǎn)程調(diào)用另外一臺(tái)計(jì)算機(jī)的子程序,而不用去關(guān)心底層的網(wǎng)絡(luò)通信細(xì)節(jié),對(duì)我們來(lái)說(shuō)是透明的。經(jīng)常用于分布式網(wǎng)絡(luò)通信中。

什么是RPC?

1、RPC(Remote Procedure Call)遠(yuǎn)程過(guò)程調(diào)用,它允許一臺(tái)計(jì)算機(jī)程序遠(yuǎn)程調(diào)用另外一臺(tái)計(jì)算機(jī)的子程序,而不用去關(guān)心底層的網(wǎng)絡(luò)通信細(xì)節(jié),對(duì)我們來(lái)說(shuō)是透明的。經(jīng)常用于分布式網(wǎng)絡(luò)通信中。

2、Hadoop的進(jìn)程間交互都是通過(guò)RPC來(lái)進(jìn)行的,比如Namenode與Datanode之間,Jobtracker與Tasktracker之間等。

RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中, RPC跨越了傳輸層和應(yīng)用層。 RPC使得開(kāi)發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。

RPC采用客戶機(jī)/服務(wù)器模式。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。

首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息,在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息的到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息給client然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。

RPC特點(diǎn)

1、透明性:遠(yuǎn)程調(diào)用其他機(jī)器上的程序,對(duì)用戶來(lái)說(shuō)就像是調(diào)用本地方法一樣。

2、高性能:RPC server能夠并發(fā)處理多個(gè)來(lái)自Client的請(qǐng)求(請(qǐng)求隊(duì)列)。3、可控性:jdk中已經(jīng)提供了一個(gè)RPC框架–RMI,但是該RPC框架過(guò)于重量級(jí)并且可控之處比較少,所以Hadoop RPC實(shí)現(xiàn)了自定義的RPC框架。

Hadoop RPC通信

1、序列化層:Client與Server端 通信傳遞的信息采用了Hadoop里提供的序列化類或自定義Writable類型。

2、函數(shù)調(diào)用層:Hadoop RPC通過(guò)動(dòng)態(tài)代理以及Java反射機(jī)制實(shí)現(xiàn)函數(shù)調(diào)用。

3、網(wǎng)絡(luò)傳輸層:Hadoop RPC采用了基于TCP/IP的socket機(jī)制。

4、服務(wù)器端框架層:RPC Server利用Java NIO以及采用了事件驅(qū)動(dòng)的I/O模型,提高RPC Server的并發(fā)處理能力。

Hadoop的整個(gè)體系結(jié)構(gòu)就是構(gòu)建在RPC之上(org.apache.hadoop.ipc)。

Hadoop RPC設(shè)計(jì)技術(shù)

1、動(dòng)態(tài)代理

2、反射3、序列化4、非阻塞的異步IO(NIO)

動(dòng)態(tài)代理

1、動(dòng)態(tài)代理可以提供對(duì)另一個(gè)對(duì)象的訪問(wèn),同時(shí)隱藏實(shí)際對(duì)象的具體事實(shí),代理對(duì)象對(duì)客戶隱藏了實(shí)際對(duì)象。

2、動(dòng)態(tài)代理可以對(duì)請(qǐng)求進(jìn)行其他的一些處理,在不允許直接訪問(wèn)某些類,或需要對(duì)訪問(wèn)做一些特殊處理等,這時(shí)候可以考慮使用代理。3)目前Java開(kāi)發(fā)包中提供了對(duì)動(dòng)態(tài)代理的支持,但現(xiàn)在只支持對(duì)接口的實(shí)現(xiàn)。相關(guān)的類與接口:java.lang.reflect.Proxy--類 java.lang.reflect.InvocationHandler--接口

動(dòng)態(tài)代理創(chuàng)建對(duì)象過(guò)程:

InvocationHandler handler = new InvocationHandlerImpl(...) Proxy.newInstance(...)

具體實(shí)現(xiàn)可參考如下:

 

Hadoop RPC遠(yuǎn)程過(guò)程調(diào)用源碼解析及實(shí)例

根據(jù)上圖查看hadoop2.6.0源碼

Client

Server

RPC

幾個(gè)重要的協(xié)議

ClientProtocol是客戶端(FileSystem)與NameNode通信的接口。

DatanodeProtocol是DataNode與NameNode通信的接口NamenodeProtocol是SecondaryNameNode與NameNode通信的接口。DFSClient是直接調(diào)用NameNode接口的對(duì)象。用戶代碼是通過(guò)DistributedFileSystem調(diào)用DFSClient對(duì)象,才能與NameNode打交道。

模擬Hadoop RPC通信

  1. package MyRPC; 
  2. import org.apache.hadoop.io.Text; 
  3. import org.apache.hadoop.ipc.VersionedProtocol; 
  4.  
  5. public interface MyRPCProtocal extends VersionedProtocol{ 
  6.     public static long versionID = 23234l;//很重要很重要,搞了一下午才解決掉。 
  7.     public Text test(Text t); 

 

  1. package MyRPC; 
  2.  
  3. import java.io.IOException; 
  4. import org.apache.hadoop.conf.Configuration; 
  5. import org.apache.hadoop.io.Text; 
  6. import org.apache.hadoop.ipc.ProtocolSignature; 
  7. import org.apache.hadoop.ipc.RPC; 
  8. import org.apache.hadoop.ipc.RPC.Server; 
  9.  
  10. public class RPCServer implements MyRPCProtocal{     
  11.     Server server = null
  12.     public RPCServer() throws IOException, InterruptedException{ 
  13.         //server = RPC.getServer(this,"localhost",8888,new Configuration()); 
  14.         //相對(duì)于以前的版本有略微的改動(dòng) 
  15.         RPC.Builder ins = new RPC.Builder(new Configuration()); 
  16.         ins.setInstance(this); 
  17.         ins.setBindAddress("localhost"); 
  18.         ins.setPort(9999); 
  19.         ins.setProtocol(MyRPCProtocal.class); 
  20.         //RPC.setProtocolEngine(new Configuration(), MyRPCProtocal.class, RpcEngine.class); 
  21.         server = ins.build();//獲得一個(gè)server實(shí)例 
  22.         server.start(); 
  23.         server.join();   
  24.     } 
  25.  
  26.     public static void main(String[] args) throws IOException, InterruptedException { 
  27.         new RPCServer(); 
  28.     } 
  29.  
  30.     @Override 
  31.     public long getProtocolVersion(String protocol, long clientVersion) 
  32.             throws IOException { 
  33.         return MyRPCProtocal.versionID; 
  34.     } 
  35.  
  36.     @Override 
  37.     public ProtocolSignature getProtocolSignature(String protocol, 
  38.             long clientVersion, int clientMethodsHash) throws IOException {      
  39.         return new ProtocolSignature(); 
  40.     } 
  41.  
  42.     @Override 
  43.     public Text test(Text t) { 
  44.         if(t.toString().equals("RPC")){ 
  45.             return new Text("ok"); 
  46.         } 
  47.         return new Text("false"); 
  48.     } 
  49. package MyRPC; 
  50.  
  51. import java.net.InetSocketAddress; 
  52.  
  53. import org.apache.hadoop.conf.Configuration; 
  54. import org.apache.hadoop.io.Text; 
  55. import org.apache.hadoop.ipc.RPC; 
  56.  
  57. public class RPCClient { 
  58.  
  59.     private MyRPCProtocal protocal; 
  60.  
  61.     public RPCClient() throws Exception{ 
  62.         InetSocketAddress address = new InetSocketAddress("localhost",9999); 
  63.  
  64.         protocal = (MyRPCProtocal)RPC.waitForProxy 
  65.                 (MyRPCProtocal.class,MyRPCProtocal.versionID, address, new Configuration()); 
  66.         //RPC.setProtocolEngine(new Configuration(), MyRPCProtocal.class, RpcEngine.class); 
  67.     } 
  68.  
  69.     public void call(String s){ 
  70.         final Text string = protocal.test(new Text(s)); 
  71.         System.out.println(string.toString()); 
  72.     } 
  73.  
  74.     public static void main(String[] args) throws Exception { 
  75.         RPCClient client = new RPCClient(); 
  76.         client.call("RPC"); 
  77.     } 
 
責(zé)任編輯:王雪燕 來(lái)源: 翼宇軒的博客
相關(guān)推薦

2023-05-18 08:47:42

2009-06-15 10:00:08

FluorineFx庫(kù)Silverlight

2022-06-04 11:12:12

RPCREST協(xié)議

2024-08-01 17:20:55

2019-02-21 10:35:44

Windows10遠(yuǎn)程過(guò)程調(diào)用錯(cuò)誤

2012-04-11 15:41:48

JavaNIO

2022-09-14 14:41:21

RPC框架RPC協(xié)議

2024-05-31 08:45:24

2014-09-02 10:43:45

RedisRPC

2020-05-17 16:15:49

RPCJava代碼

2023-10-23 11:07:37

HTTPRPC

2011-08-23 13:14:05

JDBC帶輸出參數(shù)的存儲(chǔ)過(guò)程

2024-08-29 10:12:35

RPC通信機(jī)制遠(yuǎn)程過(guò)程

2021-11-15 14:02:27

RPCSpringBootRabbitMQ

2016-04-21 10:10:31

Java應(yīng)用架構(gòu)

2020-01-09 11:11:35

RPC框架調(diào)用遠(yuǎn)程

2020-01-16 10:48:21

HTTPRPC協(xié)議

2019-06-17 08:21:06

RPC框架服務(wù)

2021-10-13 08:21:52

Java websocket Java 基礎(chǔ)

2022-02-16 16:28:22

RPC鴻蒙操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)