【图文详细 】Scala——Hadoop RPC

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_42246689/article/details/85329367

2、Hadoop RPC 

2.1、Hadoop RPC 概述 

同其他 RPC 框架一样,Hadoop RPC 分为四个部分: 
 
1、序列化层:Client 与 Server 端通信传递的信息采用了 Hadoop 里提供的序列化类或自定义 的 Writable 类型; 
2、函数调用层:Hadoop RPC 通过动态代理以及 Java 反射实现函数调用; 
3、网络传输层:Hadoop RPC 采用了基于 TCP/IP 的 socket 机制; 
4、服务器端框架层:RPC Server利用Java NIO以及采用了事件驱动的I/O模型,提高RPC Server 的并发处理能力; 
 
Hadoop RPC 在整个 Hadoop 中应用非常广泛,Client、DataNode、NameNode 之间的通讯全 靠它了。例如:我们平时操作 HDFS 的时候,使用的是 FileSystem 类,它的内部有个 DFSClient 对象,这个对象负责与 NameNode 打交道。在运行时,DFSClient 在本地创建一个 NameNode 的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到 NameNode 的方法, 也能返回值。 
 

2.2、Hadoop RPC 涉及的技术 

1、代理:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对 象对客户隐藏了实际对象。目前 Java 开发包中提供了对动态代理的支持,但现在只支持对 接口的实现。 
 2、反射----动态加载类 
3、序列化 
4、非阻塞的异步 IO(NIO)

Java NIO 原理请参考阅读:http://weixiaolu.iteye.com/blog/1479656 

2.3、Hadoop RPC 对外提供的接口 

Hadoop RPC 对外主要提供了两种接口(见类 org.apache.hadoop.ipc.RPC),分别是: 
1、public static <T> ProtocolProxy <T> getProxy/waitForProxy(…)

构造一个客户端代理对象(该对象实现了某个协议),用于向服务器发送 RPC 请求。 
2、public static Server RPC.Builder (Configuration).build()

为某个协议(实际上是 Java 接口)实例构造一个服务器对象,用于处理客户端发送的请求。 

2.4、使用 Hadoop RPC 构建应用的步骤 

1、定义 RPC 协议

RPC 协议是客户端和服务器端之间的通信接口,它定义了服务器端对外提供的服务接口。 
 
2、实现 RPC 协议

Hadoop RPC 协议通常是一个 Java 接口,用户需要实现该接口。 
 
3、构造和启动 RPC SERVER

直接使用静态类 Builder 构造一个 RPC Server,并调用函数 start()启动该 Server。 
 
4、构造 RPC Client 并发送请求

使用静态方法 getProxy 构造客户端代理对象,直接通过代理对象调用远程端的方法。 

2.5、Hadoop RPC 应用案例 

2.5.1、定义 RPC 协议 

package com.mazh.rpc; 
 
import org.apache.hadoop.ipc.VersionedProtocol; 
 
/** 
  * RPC协议: 用来定义服务 
  * 要实现 VersionedProtocol这个接口: 不同版本的 Server和 Client之前是不能进行通信的  
*/ 
public interface BussinessProtocol { 
    void mkdir(String path); 
    void hello(String name); 
 
    long versionID = 345043000L; 
}

2.5.2、实现 RPC 协议 

package com.mazh.rpc; 
 
/** 
 * 实现 协议 
*/ 
public class BusinessIMPL implements BussinessProtocol { 
    @Override 
    public void mkdir(String path) {
         System.out.println("成功创建了文件夹 :" + path); 
    } 
 
    @Override 
    public void hello(String name) {
         System.out.println("hello :" + name); 
    } 
} 

2.5.3、构建 RPC Server 并启动服务 

package com.mazh.rpc; 
 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.ipc.RPC; 
 
import java.io.IOException; 
 
/** 
 * 描述:模拟 Hadoop 构建一个 RPC服务端 
 * 作者:李涛:https://blog.csdn.net/qq_42246689
*/ 
public class MyNamenode { 
    public static void main(String[] args) { 
 
        try { 
            RPC.Server server = new RPC.Builder(new Configuration()) 
                    .setProtocol(BussinessProtocol.class) 
                    .setInstance(new BusinessIMPL()) 
                    .setBindAddress("localhost") 
                    .setPort(6789) 
                    .build(); 
 
            server.start(); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

2.5.4、构建 RPC Client 并发出请求 

package com.mazh.rpc; 
 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.ipc.RPC; 
 
import java.io.IOException; 
import java.net.InetSocketAddress; 
 
/** 
 * 构建 RPC 客户端 
 
*/ 
public class MyDataNode { 
    public static void main(String[] args) { 
 
        /** 
         * Class<T> protocol, 
         * long clientVersion, 
         * InetSocketAddress addr, 
         * Configuration conf 
         */ 
        try { 
 
            /** 
              * 获取了服务端中暴露了的服务协议的一个代理。
              * 客户端通过这个代理可以调用服务端的方法进行逻辑处理
              */ 
            BussinessProtocol proxy = RPC.getProxy(BussinessProtocol.class, 
                    BussinessProtocol.versionID, 
                    new InetSocketAddress("localhost", 6789), 
                    new Configuration()); 
 
            /** 
              * 在客户端调用了服务端的代码执行
              * 真正的代码执行是在服务端的
            */ 
            proxy.hello("hadoop"); 
            proxy.mkdir("/home/hadoop/apps"); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
} 

2.5.5、运行测试 

3、再次查看服务端:

2.5.6、通过 JPS 查看进程 

2.6、Hadoop 的进程启动分析 

1、Namenode

2、Datanode

3、SecondayNamenode

4、ZKFC

5、JournalNode 

猜你喜欢

转载自blog.csdn.net/qq_42246689/article/details/85329367