1. 程式人生 > >Hadoop-rpc呼叫案例,服務端,客戶端程式碼案例

Hadoop-rpc呼叫案例,服務端,客戶端程式碼案例

1. Hadoop-rpc框架

在hadoop中提供了一個rpc框架,通過這個rpc框架可以編寫一個rpc服務端程式,然後釋出出去供客戶端呼叫。

1.1.服務端程式碼

其中服務端(example-hadoop-rpc-server),其中程式碼結果如下:

程式碼說明:

ClientNamenodeProtocal

介面定義

NameNode

介面的實現

ServerPublisher

用於釋出服務的類

    若寫服務端程式碼,需要一個服務端的介面,其中介面如下:

package cn.toto.rpc.protocal;

public interface ClientNamenodeProtocal {

   //為了保證客戶端和服務端的版本是一致的,如果沒有定義將報錯

   public static final long versionID = 1L;

   public String getMetaData(String path);

}

介面的實現類是:

package cn.toto.rpc.server;

import cn.toto.rpc.protocal.ClientNamenodeProtocal;

public class NameNode implements ClientNamenodeProtocal {

   @Override

   public String getMetaData(String path) {

      return path + " 2 {BLK1,BLK2} {BLK1:min1,mini2} {BLK2:mini4,mini5}";

   }

}

    用於釋出的介面類:

package cn.toto.rpc.server;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.ipc.RPC;

import

org.apache.hadoop.ipc.RPC.Builder;

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

import cn.toto.rpc.protocal.ClientNamenodeProtocal;

public class ServerPublisher {

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

      Builder builder = new RPC.Builder(new Configuration());

      //暴露的僅僅是ClientNamenodeProtocal.class中的new NameNode()實現的方法

      builder.setBindAddress("localhost").setPort(8787)

             .setProtocol(ClientNamenodeProtocal.class)

             .setInstance(new NameNode());

      //構建一個Server,並且啟動一下

      Server server = builder.build();

      server.start();

   }

}

1.2.客戶端

寫完客戶端後,可以開始寫客戶端呼叫進行測試了。

    客戶端的程式碼如下:

   程式碼說明:

ClientNamenodeProtocal

和服務端一樣的介面

HdfsClient

用於呼叫的客戶端程式碼

   介面程式碼如下:

package cn.toto.rpc.protocal;

public interface ClientNamenodeProtocal {

   //為了保證客戶端和服務端的版本是一致的,如果沒有定義將報錯

   public static final long versionID = 1L;

   public String getMetaData(String path);

}

   客戶端程式碼:

package cn.toto.rpc.client;

import java.io.IOException;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.ipc.RPC;

import cn.toto.rpc.protocal.ClientNamenodeProtocal;

public class HdfsClient {

   /**

    * 在使用這個之前,需要先啟動服務端

    */

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

      //通過這種方式獲取到一個遠端呼叫物件

      ClientNamenodeProtocal nameNode = RPC.getProxy(ClientNamenodeProtocal.class,

                 1L,

                 new InetSocketAddress("localhost",8787),

                 new Configuration());

      //呼叫服務端的介面,看看返回的結果

      String metaData = nameNode.getMetaData("/a.doc");

      System.out.println(metaData);

   }

}

輸出的結果: