1. 程式人生 > >【圖文詳細 】Scala——Hadoop RPC

【圖文詳細 】Scala——Hadoop RPC

2、Hadoop RPC 

 

2.1、Hadoop RPC 概述 

同其他 RPC 框架一樣,Hadoop RPC 分為四個部分: 
 
1、序列化層:Client 與 Server 端通訊傳遞的資訊採用了 Hadoop 裡提供的序列化類或自定義 的 Writable 型別; 
2、函式呼叫層:Hadoop RPC 通過動態代理以及 Java 反射實現函式呼叫; 
3、網路傳輸層:Hadoop RPC 採用了基於 TCP/IP 的 socket 機制; 
4、伺服器端框架層:RPC Server利用Java NIO以及採用了事件驅動的I/O模型,提高RPC Server 的併發處理能力; 
 
Hadoop RPC 在整個 Hadoop 中應用非常廣泛,Client、DataNode、NameNode 之間的通訊全 靠它了。例如:我們平時操作 HDFS 的時候,使用的是 FileSystem 類,它的內部有個 DFSClient 物件,這個物件負責與 NameNode 打交道。在執行時,DFSClient 在本地建立一個 NameNode 的代理,然後就操作這個代理,這個代理就會通過網路,遠端呼叫到 NameNode 的方法, 也能返回值。 
 

 

2.2、Hadoop RPC 涉及的技術 

1、代理:動態代理可以提供對另一個物件的訪問,同時隱藏實際物件的具體事實,代理對 象對客戶隱藏了實際物件。目前 Java 開發包中提供了對動態代理的支援,但現在只支援對 介面的實現。 
 2、反射----動態載入類 
3、序列化 
4、非阻塞的非同步 IO(NIO)

Java NIO 原理請參考閱讀:http://weixiaolu.iteye.com/blog/1479656 

 

2.3、Hadoop RPC 對外提供的介面 

Hadoop RPC 對外主要提供了兩種介面(見類 org.apache.hadoop.ipc.RPC),分別是: 
1、public static <T> ProtocolProxy <T> getProxy/waitForProxy(…)

構造一個客戶端代理物件(該物件實現了某個協議),用於向伺服器傳送 RPC 請求。 
2、public static Server RPC.Builder (Configuration).build()

為某個協議(實際上是 Java 介面)例項構造一個伺服器物件,用於處理客戶端傳送的請求。 

 

2.4、使用 Hadoop RPC 構建應用的步驟 

1、定義 RPC 協議

RPC 協議是客戶端和伺服器端之間的通訊介面,它定義了伺服器端對外提供的服務介面。 
 
2、實現 RPC 協議

Hadoop RPC 協議通常是一個 Java 介面,使用者需要實現該介面。 
 
3、構造和啟動 RPC SERVER

直接使用靜態類 Builder 構造一個 RPC Server,並呼叫函式 start()啟動該 Server。 
 
4、構造 RPC Client 併發送請求

使用靜態方法 getProxy 構造客戶端代理物件,直接通過代理物件呼叫遠端端的方法。 

 

2.5、Hadoop RPC 應用案例 

2.5.1、定義 RPC 協議 

package com.mazh.rpc; 
 
import org.apache.hadoop.ipc.VersionedProtocol; 
 
/** 
  * RPC協議: 用來定義服務 
  * 要實現 VersionedProtocol這個介面: 不同版本的 Server和 Client之前是不能進行通訊的  
*/ 
public interface BussinessProtocol { 
    void mkdir(String path); 
    void hello(String name); 
 
    long versionID = 345043000L; 
}

 

2.5.2、實現 RPC 協議 

package com.mazh.rpc; 
 
/** 
 * 實現 協議 
*/ 
public class BusinessIMPL implements BussinessProtocol { 
    @Override 
    public void mkdir(String path) {
         System.out.println("成功建立了資料夾 :" + path); 
    } 
 
    @Override 
    public void hello(String name) {
         System.out.println("hello :" + name); 
    } 
} 

 

2.5.3、構建 RPC Server 並啟動服務 

package com.mazh.rpc; 
 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.ipc.RPC; 
 
import java.io.IOException; 
 
/** 
 * 描述:模擬 Hadoop 構建一個 RPC服務端 
 * 作者:李濤:https://blog.csdn.net/qq_42246689
*/ 
public class MyNamenode { 
    public static void main(String[] args) { 
 
        try { 
            RPC.Server server = new RPC.Builder(new Configuration()) 
                    .setProtocol(BussinessProtocol.class) 
                    .setInstance(new BusinessIMPL()) 
                    .setBindAddress("localhost") 
                    .setPort(6789) 
                    .build(); 
 
            server.start(); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

 

2.5.4、構建 RPC Client 併發出請求 

package com.mazh.rpc; 
 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.ipc.RPC; 
 
import java.io.IOException; 
import java.net.InetSocketAddress; 
 
/** 
 * 構建 RPC 客戶端 
 
*/ 
public class MyDataNode { 
    public static void main(String[] args) { 
 
        /** 
         * Class<T> protocol, 
         * long clientVersion, 
         * InetSocketAddress addr, 
         * Configuration conf 
         */ 
        try { 
 
            /** 
              * 獲取了服務端中暴露了的服務協議的一個代理。
              * 客戶端通過這個代理可以呼叫服務端的方法進行邏輯處理
              */ 
            BussinessProtocol proxy = RPC.getProxy(BussinessProtocol.class, 
                    BussinessProtocol.versionID, 
                    new InetSocketAddress("localhost", 6789), 
                    new Configuration()); 
 
            /** 
              * 在客戶端呼叫了服務端的程式碼執行
              * 真正的程式碼執行是在服務端的
            */ 
            proxy.hello("hadoop"); 
            proxy.mkdir("/home/hadoop/apps"); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
} 

 

2.5.5、執行測試 

3、再次檢視服務端:

 

2.5.6、通過 JPS 檢視程序 

 

2.6、Hadoop 的程序啟動分析 

1、Namenode

2、Datanode

3、SecondayNamenode

4、ZKFC

5、JournalNode