16. Hadoop RPC 使用概述

下图给出了DFSClient调用ClientProtocol.rename()方法的流程图

16. Hadoop RPC 使用概述
15. ClientProtocol.rename()调用流程图.png

首先看下RPC协议的定义部分。

ClientProtocol协议定义了HDFS客户端与Namenode交互的所有方法,但是ClientProtocol协议中的方法的参数是无法在网络中传输的,需要对参数进行序列化操作,所以HDFS又定义了ClientNamenodeProtocolPB协议,ClientNamenodeProtocolPB协议包含了ClientProtocol定义的所有方法,但是参数却是使用protobuf序列化后的格式。这里还是以rename()方法为例,ClientNamenodeProtocolPB将ClientProtocol中rename(String,String)方法的两个参数抽象成一个RenameRequestProto对象,rename()的方法签名也就变成了rename(RenameRequestProto),这里的RenameRequestProto对象是通过protobuf序列化后的对象,是可以在网络上传输的对象。

再来看rename()调用,为了将不可以序列化的ClientProtocol接口调用转换为可以调用的ClientNamenodeProtocolPB接口调用,HDFS引入了两个适配器类(使用适配器模式的类)进行接口适配。适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

  1. ClientNamenodeProtocolTranslatorPB类

    作为Client侧的适配器类,实现了ClientProtocol接口,它内部拥有了一个实现了ClientNamenodeProtocolPB接口的对象,可以将ClientProtocol调用适配成ClientNamenodeProtocolPB调用。以rename()调用为例,ClientNamenodeProtocolTranslatorPB将rename(String,String)调用中的两个String参数序列化成一个RenameRequestProto对象,然后调用ClientNamenodeProtocolPB对象的rename(RenameRequestProto)方法,这样就完成了ClientProtocol接口到ClientNamenodeProtocolPB接口的适配

  2. ClientNamenodeProtocolServerSideTranslatorPB类

    作为Server侧的适配器类,实现了ClientNamenodeProtocolPB