Hadoop RPC简单使用

在学习一个优秀框架的源码之前,我们需要了解一些基础的知识,这次说的就是Hadoop的通信架构,那Hadoop的底层通信架构是什么呢?Netty?Akka?都不是,是Hadoop自己封装的,在这儿先称作Hadoop RPC吧

当然这篇文章只是来描述如何简单来使用Hadoop RPC,首先什么是RPC?

Hadoop RPC

RPC(remote procedure call):远程过程调用
远程:不同进程(例如服务器A和服务器B的2个进程)
过程:方法/函数

就是不同进程的方法的调用,也可以说客户端调用服务端的方法(客户端和服务端默认不在一个进程)

HadoopRPC的特点

  1. 客户端调用服务端,方法的执行是服务端
  2. 实现RPC的调用,需要一个协议(接口),里面必须有versionID
  3. 服务端需要实现这个协议

Hadoop RPC协议

public interface RpcProtocol {
    // 必须存在的属性,有兴趣可以试试去掉这个属性(序列化问题)
    long versionID = 111L;
    void sayHi(String name);
}

Hadoop RPC服务端

public class RpcServer implements RpcProtocol {

    @Override
    public void sayHi(String name) {
        System.out.println("hi, " + name);
    }

    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        RPC.Server client = new RPC.Builder(conf)
                .setProtocol(RpcProtocol.class)
                .setInstance(new RpcServer())
                .setBindAddress("localhost")
                .setPort(1234)
                .build();

        System.out.println("client started");

        client.start();
    }
}

直接启动服务端

Hadoop RPC客户端

public class RpcClient {

    public static void main(String[] args) throws IOException {
        RpcProtocol proxy = RPC.getProxy(
                RpcProtocol.class,
                // 不需要和"协议"的versionID一致
                1231231L,
                new InetSocketAddress("localhost", 1234),
                new Configuration()
        );

        System.out.println("client start");
        proxy.sayHi("Jshenp");
        System.out.println("client end");
    }
}

代码很简单,结果很明显,大家自己试试
当然我们使用jps命令是能看到对应的服务端进程的哦

通过代码,我们在加点场景

假设我们要访问HDFS上的一个文件,我们会和NameNode进行通信,在这个场景下,我们就是客户端,NameNode就是服务端,接下来我们又需要和服务端拿文件块,服务端就变成DataNode了,这样Hadoop就实现了最基本的通信功能,也了解Hadoop的底层通信通信如何

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。