码迷,mamicode.com
首页 > 其他好文 > 详细

hadoop[6]-rpc

时间:2018-11-27 01:20:40      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:comm   import   public   sof   引用   2.4.1   toc   dep   instance   

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

标签:comm   import   public   sof   引用   2.4.1   toc   dep   instance   

原文地址:https://www.cnblogs.com/wange/p/9866527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!