其他分享
首页 > 其他分享> > 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC

【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC

作者:互联网

RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑,是分布式系统的基础。允许运行于一台计算机上的程序像调用本地方法一样,调用另一台计算机的子程序。
由于 RPC 服务整体知识较多,本节仅针对对 Yarn RPC 进行简略介绍,详细内容会后续开专栏介绍。

一、RPC 通信模型介绍

为什么会有 RPC 框架?
在分布式或微服务情境下,会有大量的服务间交互,如果用传统的 HTTP 协议端口来通信,需要耗费大量时间处理网络数据交换上,还要考虑编解码等问题。如下图所示。

二、Hadoop RPC 介绍

一)简介

Hadoop RPC 是 Hadoop 自己实现的一个 RPC 框架,主要有以下几个特点:

框架原理和整体执行流程与第一节介绍的 RPC 框架一致,感兴趣可深入源码进行了解。

二)总体架构

Hadoop RPC 架构底层依靠 Java 的 nio、反射、动态代理等功能实现「客户端 - 服务器(C/S)」通信模型。
上层封装供程序调用的 RPC 接口。

三、案例 demo

一)RPC Writable 案例实现

1、新建一个 maven 工程,添加依赖

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

2、定义 RPC 协议

public interface BusinessProtocol {
    void mkdir(String path);
    String getName(String name);
    long versionID = 345043000L;
}

3、定义协议实现

public class BusinessIMPL implements BusinessProtocol {
    @Override
    public void mkdir(String path) {
        System.out.println("成功创建了文件夹 :" + path);
    }

    @Override
    public String getName(String name) {
        System.out.println("成功打了招呼: hello :" + name);
        return "bigdata";
    }
}

4、通过 Hadoop RPC 构建一个 RPC 服务端

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;

public class MyServer {
    public static void main(String[] args) {
        try {
            // 构建一个 RPC server 端,提供了一个 BussinessProtocol 协议的 BusinessIMPL 服务实现
            RPC.Server server = new RPC.Builder(new Configuration())
                    .setProtocol(BusinessProtocol.class)
                    .setInstance(new BusinessIMPL())
                    .setBindAddress("localhost")
                    .setPort(6789)
                    .build();

            server.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5、构建一个 RPC 客户端

import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.conf.Configuration;

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

public class MyClient {
    public static void main(String[] args) {
        try {
        	// 获取代理类实例,也就是 Stub
            BusinessProtocol proxy = RPC.getProxy(BusinessProtocol.class, BusinessProtocol.versionID,
                    new InetSocketAddress("localhost", 6789), new Configuration());

            // 通过 Stub 发送请求,实际使用就像调用本地方法一样
            proxy.mkdir("/tmp/ABC");
            String res = proxy.getName("Simon");
            System.out.println("从 RPC 服务端接收到的返回值:" + res);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6、测试,先启动服务端,再启动客户端
服务端输出

成功创建了文件夹 :/tmp/ABC
成功打了招呼: hello :Simon

客户端输出

从 RPC 服务端接收到的返回值:bigdata

二)RPC Protobuf 案例实现

对 proto 文件格式不熟悉的同学,参考上一篇文章《2-1 Yarn 基础库概述》

标签:Yarn,架构,基础,底层,模型,框架,服务端,客户端,定义,STUB,请求,
来源: