1. 程式人生 > >Hadoop RPC詳解-RMI

Hadoop RPC詳解-RMI

Hadoop RPC 遠端過程呼叫是Hadoop中的核心概念。在深入研究RPC之前,先看看遠端呼叫的鼻祖Java RMI.

1.什麼是RMI

Java遠端方法呼叫,即Java RMI(Java Remote Method Invocation)是Java程式語言裡,一種用於實現遠端過程呼叫應用程式程式設計介面。它使客戶機上執行的程式可以呼叫遠端伺服器上的物件。遠端方法呼叫特性使Java程式設計人員能夠在網路環境中分佈操作。RMI全部的宗旨就是儘可能簡化遠端介面物件的使用。

Java RMI極大地依賴於介面。在需要建立一個遠端物件的時候,程式設計師通過傳遞一個介面來隱藏底層的實現細節。客戶端得到的遠端物件控制代碼正好與本地的根程式碼連線,由後者負責透過網路通訊。這樣一來,程式設計師只需關心如何通過自己的介面控制代碼傳送訊息。

介面的兩種常見實現方式是:

(1)最初使用JRMP(Java Remote Message Protocol,Java遠端訊息交換協議)實現;

(2)此外還可以用與CORBA相容的方法實現。

RMI一般指的是程式設計介面,也有時候同時包括JRMP和API(應用程式程式設計介面),而RMI-IIOP則一般指RMI介面接管絕大部分的功能,以支援CORBA的實現。最初的RMI API設計為通用地支援不同形式的介面實現。後來,CORBA增加了傳值(pass by value)功能,以實現RMI介面。然而RMI-IIOPJRMP實現的介面並不完全一致。

2.RMI例項

RMI相關的類和介面都在jdkjava.rmi

包中。

RMI的基礎是介面,RMI構架基於一個重要的原理:定義介面和定義介面的具體實現是分開的。

下面我們通過具體的例子,建立一個簡單的遠端計算服務和使用它的客戶程式

一個正常工作的RMI系統由下面幾個部分組成:
遠端服務的介面定義

遠端服務介面的具體實現

Stub 和 Skeleton 檔案

一個執行遠端服務的伺服器

一個RMI命名服務,它允許客戶端去發現這個遠端服務

類檔案的提供者(一個HTTP或者FTP伺服器

一個需要這個遠端服務的客戶端程式

下面我們一步一步建立一個簡單的RMI系統。首先在你的機器裡建立一個新的資料夾,以便放置我們建立的檔案,為了簡單起見,我們只使用一個資料夾存放客戶端和服務端程式碼,並且在同一個目錄下執行服務端和客戶端。如果所有的RMI檔案都已經設計好了,那麼你需要下面的幾個步驟去生成你的系統:

   1、   編寫並且編譯介面的Java程式碼

 2、   編寫並且編譯介面實現的Java程式碼

 3、   從介面實現類中生成 Stub 和 Skeleton 類檔案

 4、   編寫遠端服務的主執行程式

 5、   編寫RMI的客戶端程式

 6、   安裝並且執行RMI系統

2.1 介面

第一步就是建立和編譯服務介面的Java程式碼。這個介面定義了所有的提供遠端服務的功能,下面是源程式:

/**
 * 
 */
package com.renren;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @author root
 * 
 */

public interface CalculatorRemoteInterface extends Remote {

	//! 注意,這個介面繼承自Remote,每一個定義的方法都必須丟擲一個RemoteException異常物件
	public abstract int add(int a, int b) throws RemoteException;

}

注意,這個介面繼承自Remote,每一個定義的方法都必須丟擲一個RemoteException異常物件

2.2 實現類

package com.renren;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

@SuppressWarnings("serial")
// 繼承 UnicastRemoteObject 遠端物件 這個一定要寫 否則 伺服器啟動報異常
public class CalculatorRemoteObject extends UnicastRemoteObject implements
        CalculatorRemoteInterface {

    public CalculatorRemoteObject() throws RemoteException {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    // @Override
    public int add(int a, int b) {
        // TODO Auto-generated method stub
        return a + b;
    }

}


2.3 打包

將上述兩個java檔案編譯打包為rmi-test.jar

在編寫server和client程式時需要依賴該jar包

2.4 Server

Server做的事很簡單,程式碼註釋很詳細...

package com.test;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class Server {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            // 定義遠端介面CalculatorRemoteInterface物件 用於繫結在伺服器登錄檔上 該介面由CalculatorRemoteObject類實現
            CalculatorRemoteInterface remoteObject = new CalculatorRemoteObject();
            // 定義一個埠號
            int port = 9999;
            // 建立一個接受對特定埠呼叫的遠端物件登錄檔 登錄檔上需要介面一個指定的埠號
            LocateRegistry.createRegistry(port);
            // 定義伺服器遠端地址URL格式
            String serverAddress = "rmi://10.2.185.197:" + port+"/calculator" ;
            // 繫結遠端地址和介面物件
            Naming.bind(serverAddress, remoteObject);
            // 如果啟動成功 則彈出如下資訊
            System.out.println(">>>伺服器啟動成功");
            System.out.println(">>>請啟動客戶端進行連線訪問");
        } catch (MalformedURLException e) {
            System.out.println("地址出現錯誤!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("重複綁定了同一個遠端物件!");
            e.printStackTrace();
        } catch (RemoteException e) {
            System.out.println("建立遠端物件出現錯誤!");
            e.printStackTrace();
        }
    }
    
}

2.5 Client

package com.test;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			CalculatorRemoteInterface calculator=
					(CalculatorRemoteInterface) Naming.lookup("rmi://10.2.185.197:9999/calculator");
			System.out.println("5+3="+calculator.add(5, 3));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

2.6 測試

1.在一臺機器上啟動Server

2.在兩外一臺機器上啟動Client,可以看到Client成功呼叫了Server的CalculatorRemoteObject物件的add方法.

2.7 名詞解釋 Stub Skeleton

http://blog.sina.com.cn/s/blog_4ab0d57401009n4a.html

Stub(存根)和Skeleton(骨架)
  Stub和Skeleton是經過rmic命令生成的,我們的程式要通過遠端呼叫,底層一定是套接字的位元組傳輸,要一個物件序列化成為一個位元組陣列,傳輸到伺服器或者客戶端的對端之後,再把該物件反序列化成為對應的物件,這些網路傳輸的過程要求安全,穩定等等非常麻煩的操作,Stub駐留客戶端,承擔著代理遠端物件的實現者的角色,Skeleton類幫助遠端物件與Stub再RMI連線上進行通訊。RMI的客戶與Stub進行交換,Stub與Skeleton通訊,Skeketon負責與伺服器進行互動,因此有了Stub和Skeleton之後我們就不需要實現底層通訊的細節,我們進行的遠端呼叫,只需要通過介面對方法進行操作即可,使分散式呼叫實現了位置上的透明,即:遠端呼叫就像本地呼叫一樣。
   通俗的說,RMI的代理模式迫使方法呼叫必須通過充當替身的代理物件,即Stub和Skeleton,由這些代理物件將方法傳遞給實際的物件。
   在遠端虛擬機器中,每個遠端物件都有一個Skeleton對應,Skeleton負責將呼叫分配給實際的遠端物件來實現,他的工作是在伺服器端的。在JDK1.2版本以上的環境中不需要Skeleton,因為Jdk1.2推出了附加的Skeleton,並且對底層的協議也進行了修改,效能上有很大提升,預設的rmic命令是不會產生Skeleton類的,如果要想生成Skeleton類可以使用rmic-v1.1 即可。
   Stub的操作任務:
    a、初始化與包含遠端物件遠端虛擬機器的連線
    b、與遠端虛擬機器引數進行編組,也就是排程,包括引數的寫入以及傳輸
    c、等待方法的呼叫結果
    d、解編返回值和返回的異常。也就是讀取伺服器上的返回值,也稱為反排程
    e、將結果返回給呼叫程式。
   Skeleton對應的任務:
    a、讀取遠端方法的引數,也就是解編
    b、呼叫實際遠端物件上的方法
    c、將結果或者異常組編(寫入並傳輸)給呼叫程式。
   Stub與Skeleton的關係以及操作是對應的關係。只要我們有編譯好的遠端物件的類,就可以呼叫jdk的rmic命令來生成stub和skeleton了,關鍵是我們需要理解Stub是客戶端應用程式的代理,Skeleton是伺服器端應用程式的代理,他們之間協作完成客戶端與伺服器之間的方法呼叫時的通訊。
   瞭解者兩個概念之後,我們接下來需要了解JNDI以及RMI登錄檔兩個概念,等剩下的兩個概念瞭解了,我們基本上對RMI就可以入門了。
 

參考:

http://blog.csdn.net/wangxingbao4227/article/details/6842951

http://blog.csdn.net/tin591/article/details/8117198

http://hi.baidu.com/dl_linfeng/item/330036304422c65c80f1a778


相關推薦

Hadoop RPC-RMI

Hadoop RPC 遠端過程呼叫是Hadoop中的核心概念。在深入研究RPC之前,先看看遠端呼叫的鼻祖Java RMI. 1.什麼是RMI Java遠端方法呼叫,即Java RMI(Java Remote Method Invocation)是Java程式語言

hadoop框架

con 完成 shu ati 默認 logs 應用 sso 分布式存 Hadoop學習隨筆(參考:http://blog.csdn.net/mobanchengshuang/article/details/78786652) Hadoop項目主要包括以下四個模塊 ◆ Had

大數據hadoop入門之hadoop家族

集成 查詢工具 人員 進一步 容錯 基礎知識 不同的 ima nbsp 大數據hadoop入門之hadoop家族詳解 大數據這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習

HADOOP IO——序列化(1)

什麼是IO? I:input 輸入 通常做讀取操作(將不同資料來源的資料讀入到記憶體中,也叫讀取流) O:output 輸出 通常做寫入操作(將記憶體中的資料寫入到不同的資料來源,也叫寫入流)(出記憶體到別的地方) 序列化的作用是什麼?1 資料通訊 2 持久化儲存 為什

HADOOP IO——序列化(2)舉列

package com.hadoop.tv; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Writ

hadoop家族學習路線圖之hadoop產品

大資料這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習hadoop的人變多了。作為一個hadoop入門級的新手,你會覺得哪些地方很難呢?執行環境的搭建恐怕就已經足夠讓新手頭疼

Hadoop原始碼之DBOutputFormat類

Hadoop 原始碼詳解之 DBOutputFormat 類 1. 類釋義 A OutputFormat that sends the reduce output to a SQL table. 一種將Reduce 輸出到一個SQL表中的輸出格式。 DB

Hadoop原始碼之Mapper類

Hadoop原始碼詳解之Mapper類 1. 類釋義 Maps input key/value pairs to a set of intermediate key/value pairs. 將輸入的鍵值對應成一系列的中間鍵值對 Maps are the

Hadoop原始碼之FileOutputFormat 類

Hadoop 原始碼詳解之FileOutputFormat 類 1. 類釋義 A base class for OutputFormats that read from FileSystems. 一個類從FileSystems讀取 用於OutputFormats 【實在翻

Hadoop 原始碼之FileInputFormat類

Hadoop 原始碼詳解之FileInputFormat類【updating…】 1. 類釋義 A base class for file-based InputFormats. 針對基於檔案的 InputFormats 一個基類 FileInputFo

Hadoop 原始碼之RecordReader介面

Hadoop 原始碼詳解之RecordReader介面 1. 類釋義 RecordReader reads <key, value> pairs from an InputSplit. RecordReader 從InputSplit中讀取<key,va

Hadoop原始碼之Job 類

Hadoop原始碼詳解之Job類 1. 原始碼 包:org.apache.hadoop.mapreduce 繼承的介面有:AutoCloseable,JobContext,org.apache.hadoop.mapreduce.MRJobConfig

Hadoop Operations(Hadoop操作) (二) HDFS

       最初,客戶機發出請求,使用Hadoop檔案系統api開啟指定的檔案。如果使用者有必要的許可權,則將請求傳送到namenode,以建立檔案元資料。新檔案的元資料條目;但是,它最初沒有相關的塊。對客戶機的響應表明開啟的請求是成功的,並且它現在可能開始寫入資料。在API級別,返回一個標準的Java流物

遠端過程呼叫(RPC)

本文介紹了什麼是遠端過程呼叫(RPC),RPC 有哪些常用的方法,RPC 經歷了哪些發展階段,以及比較了各種 RPC 技術的優劣。 什麼是 RPC RPC 是遠端過程呼叫(Remote Procedure Call)的縮寫形式,Birrell 和 N

hadoop sequenceFile

hadoop不僅可以處理文字資訊,還可以處理二進位制格式資料,sequenceFile就是這樣的檔案。有以下特點:可分割支援壓縮每一行都是一個key value對可以設定同步點SequenceFile的格式是由一個header 跟隨一個或多個記錄組成。前三個位元組是一個Byt

Spring 實現遠端訪問——rmi

一.  緒論 Spring為各種遠端訪問技術提供整合工具類。Spring遠端訪問通過使用普通POJOs,能更容易的開發遠端訪問服務。目前,Spring遠端訪問的主要技術如下: 1.      遠端呼叫

Mahout駕馭hadoop

            眾所周知,Mahout是基於Hadoop分散式系統的,要想看懂Mahout的原始碼,首先得明白mahout是如何使用hadoop的!             首先,在我的<<Hadoop執行原理詳解>>一篇中,詳細介紹了ha

雲端計算期末報告無圖 kmeans和最短路徑演算法hadoop實現

《雲端計算應用開發實驗》大作業報告 一.實驗環境與實驗工具 ubuntu 16.04真機 + hadoop2.6 + 本地偽分佈   二.實驗原理 以下內容為科普性內容,不過裡面還是有一些關鍵的解釋在配環境的時候用得上 Hadoop是一個

hadoop wordcount

mapreducehadoop中的分散式運算程式設計框架,只要按照其程式設計規範,只需要編寫少量的業務邏輯程式碼即可實現一個強大的海量資料併發處理程式 Demo開發——wordcount 1、需求 從大量(比如T級別)文字檔案中,統計出每一個單詞出現的總次數 2、map

分散式系統--框架(Hadoop--RPC協議)

                   分散式系統詳解--框架(Hadoop--RPC協議)        在之前的一篇文章當中已經寫過一篇文章是關於RPC通