hadoop[6]-rpc

Posted wange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop[6]-rpc相关的知识,希望对你有一定的参考价值。

Hadoop中各节点之间存在大量的远程过程调用,hadoop为此封装了一个RPC基础框架,使用方法如下:

服务端代码pom:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.4.1</version>
</dependency>

RCP通信的两端共同遵守的协议(本质上就是业务实现类的接口)

public interface NameNodeProtocal {
    //RPC通信双方一致的版本号
    public static final long versionID = 1L;
    //业务方法签名
    public String getMetaData(String path);
}

实现类

public class NameNodeProtocalImpl implements NameNodeProtocal {
    @Override
    public String getMetaData(String path) {
        return "metadata";
    }
}

发布服务

import com.wange.service.NameNodeProtocal;
import com.wange.service.impl.NameNodeProtocalImpl;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.*;
import java.io.IOException;

public class Application {
    public static void main(String[] args) throws Exception {
        //创建一个RPC服务builder
        Builder builder = new RPC.Builder(new Configuration());
        //将要发布的服务的信息设置到builder中
        builder.setBindAddress("hadoop-server-00").setPort(10000).setProtocol(NameNodeProtocal.class).setInstance(new NameNodeProtocalImpl());

        //用builder构建出一个socket服务
        Server server = builder.build();
        //将服务启动,就可以等待客户端请求
        server.start();
    }
}

将代码打成一个jar包,上传到hadoop-server-00服务器上,启动它:java -jar xxx.jar

 

客户端调用,pom引入依赖和服务端相同,将协议文件(NameNodeProtocal)拷贝过来,就可以开始调用了,代码如下:

import com.wange.service.NameNodeProtocal;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.*;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Application {
    public static void main(String[] args) throws IOException {
        System.setProperty("hadoop.home.dir", "E:/soft/hadoop-2.4.1");
        //首先用RPC框架获得要调用的远端服务的引用(动态代理对象)
        NameNodeProtocal namenodeImpl = RPC.getProxy(NameNodeProtocal.class, 1L, new InetSocketAddress("hadoop-server-00", 10000), new Configuration());
        //因为这个动态代理对象实现了业务类的接口,所以可以直接通过这个引用来调用业务类的实现方法(本质上,具体实现在远端,走的是socket通信请求)
        String metaData = namenodeImpl.getMetaData("/m1");

        System.out.println(metaData);
    }
}

这样就完成了,使用非常简单,这就是hadoop为我们封装好的rpc基础调用。

以上是关于hadoop[6]-rpc的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop中的RPC

hadoop rpc 学习

利用Hadoop提供的RPC API实现简单的RPC程序

RPC框架研究Hadoop源代码-1

Hadoop RPC通信机制

Hadoop HDFS编程 API入门系列之RPC版本2