hadoop rpc基礎


第一部分: hadoop rpc基礎

 

RPC,遠程程序調用,分布式計算中C/S模型的一個應用實例。

同其他RPC框架一樣,Hadoop分為四個部分:

  • 序列化層:支持多種框架實現序列化與反序列化
  • 函數調用層:利用java反射與動態代理實現
  • 網絡傳輸層:基於TCP/IP的Socket機制
  • 服務的處理框架:基於Reactor模式的事件驅動IO模型

 

Hadoop RPC主要對外提供2種接口

public static ProtocolProxy getProxy/waitForProxy:

構造一個客戶端代理對象,向服務器發送RPC請求

 

public static Server RPC.Builder(Configuration).build(…):

為某個協議實例構造一個服務器對象,用於處理客戶端發送請求。

 

 

如何使用Hadoop RPC?

其實很簡單,按照下面四步即可完成高性能CS網絡模型

1.定義RPC協議

2.實現RPC協議

3.構造和啟動RPC SERVER

4.構造RPC Client並發送請求

 

下面是代碼實例, 依賴hadoop-common-版本.jar

 

1.定義RPC協議

hadoop中所有自定義RPC接口都必須繼承VersionedProtocol接口

 

package myrpc;

 

import org.apache.hadoop.ipc.VersionedProtocol;

 

/**

 * Created by ywszjut on 14-8-22.

 */

public interface ClientProtocol extends VersionedProtocol {

    public static final long versionID=1L;

    String echo(String value);

}

 

 

2.實現協議

 

package myrpc;

 

import org.apache.hadoop.ipc.ProtocolSignature;

 

import java.io.IOException;

 

/**

 * Created by ywszjut on 14-8-22.

 */

public class ClientProtocolImpl implements ClientProtocol {

    @Override

    public String echo(String value) {

        return "hello "+value;

    }

 

    @Override

    public long getProtocolVersion(String s, long l) throws IOException {

        return ClientProtocol.versionID;

    }

 

    @Override

    public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {

        return new ProtocolSignature(ClientProtocol.versionID,null);

    }

}

 

 

 

3.構造和啟動RPC SERVER

package myrpc;

 

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.ipc.RPC;

import org.apache.hadoop.ipc.RPC.Server;

 

import java.io.IOException;

 

/**

 * Created by ywszjut on 14-8-22.

 */

public class MyRpcServer {

 

    public static void main(String[] args) throws IOException {

        Server server = new RPC.Builder(new Configuration()).setProtocol(ClientProtocol.class)

                .setInstance(new ClientProtocolImpl()).setBindAddress("127.0.0.1").setPort(8787)

                .setNumHandlers(5).build();

        server.start();

    }

}

 

 

4.構造客戶端並發送請求

package myrpc;

 

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.ipc.RPC;

 

import java.io.IOException;

import java.net.InetSocketAddress;

 

/**

 * Hello world!

 */

public class Client {

    public static void main(String[] args) throws IOException {

 

        ClientProtocol proxy = (ClientProtocol) RPC.getProxy(ClientProtocol.class,ClientProtocol.versionID,new InetSocketAddress("127.0.0.1",8787),new Configuration());

 

        String result = proxy.echo("123");

 

        System.out.println(result);

    }

}

 

 

 

 

測試的時候,先啟動3,再啟動4,你會發現控制台打出了hello 123

 

 

好,既然hello world 搞完, 開始學習RPC類的具體實現

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM