Hadoop RPC初探

1、各個工具的通訊技術

在分佈式系統中,網絡通訊是底層的基礎模塊,不同的大數據工具使用不同的通訊技術,比如:

組件 通訊技術
Hadoop Hadoop自己封裝了RPC
Flink Akka
Kafka NIO
Spark 老版本使用了Akka,新版本Netty

Hadoop自己對RPC做了封裝,叫做Hadoop RPC,RPC是Remote Procedure Call的簡稱,是遠程過程調用,遠程調用是指不同進程之間的調用,過程調用是指方法調用,也就是不同進程之間的方法調用,比如客戶端是一個進程,服務端是一個進程,他們兩個之間的方法調用就是遠程過程調用。

2、通過例子嘗試一下Hadoop RPC

舉個例子,展示了Hadoop RPC的調用方式:

package com.chybin.hdfs.rpc;

/***
 * 定義一個接口,實際上就是RPC的一個協議
 */
public interface MyProtocol {
    //必須要有一個versionID
    long versionID=666L;
    //接口(協議)中定義了一個方法,實現了協議的服務端必須要實現這個方法,
    // 以供客戶端進行調用。
    void mkdir(String path);
}

package com.chybin.hdfs.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import java.io.IOException;

/***
 * 模擬一個NameNode服務端,實現了協議中的方法
 */
public class MyNameNodeServiceRpc implements MyProtocol {
    public void mkdir(String path) {
        System.out.println("服務端執行了mkdir:"+path);
    }
    public static void main(String[] args) throws IOException {
        Server server=new RPC.Builder(new Configuration())
                .setBindAddress("localhost")
                .setPort(1234)
                .setProtocol(MyProtocol.class)
                .setInstance(new MyNameNodeServiceRpc())
                .build()
                ;
        System.out.println("服務端啓動....");
        server.start();
    }
}


package com.chybin.hdfs.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;

/***
 * 客戶端
 */
public class ClientRpc {
    public static void main(String[] args) throws IOException {
        //定義一個協議,定義一個代理來與服務端進行通信。
        MyProtocol nameNode = RPC.getProxy(
                MyProtocol.class,
                MyProtocol.versionID,
                new InetSocketAddress("localhost", 1234),
                new Configuration()
        );
        System.out.println("客戶端調用遠程的mkdir方法:");
        nameNode.mkdir("/user/soft");
    }
}

這個例子中模擬了客戶端調用NameNode服務端的mkdir方法的過程,其中MyProtocol接口實際上就是一個PRC的協議,服務端和客戶端根據這個接口中的定義來進行方法實現和調用,所以在做爲服務端的MyNameNodeServiceRpc要實現MyProtocol 接口,服務端啓動後,客戶端使用同樣的協議使用代理遠程調用服務端的mkdir()方法。

3、Hadoop RPC的一些總結

  1. Hadoop RPC是指的是不同進程之間的方法調用, 也就是客戶端對服務端的方法調用。
  2. Hadoop RPC的協議實際上就是一個個的接口,通訊雙方依據接口分別進行實現和遠程調用。
  3. 協議接口中必須要有一個versionID以標識協議的版本。
  4. Hadoop RPC服務端啓動後是一個進程,可以使用jps命令查看到進程。
  5. 使用new RPC.Builder來定義一個服務端。
  6. 使用RPC.getProxy來定義一個代理來調用服務端方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章