HDFS Protocol修改流程

    相对于1.x版本的Hadoop,2.x版本的Hadoop采用了Protocol Buffer作为序列化反序列化工具,以及RPC通讯工具。这样当我们对Hadoop源码进行修改之前,就需要了解Hadoop 2.x的代码结构和修改方法。

    几个结构,以DatanodeProtocol举列子:

NewImageNewImage

    DatanodeProtocol.java 还像1.x一样只是一个接口,NameNode继承这一个接口,实现所有功能,但2.x新增了DatanodeProtocolPB.java,DatanodeProtocolClientSideTranslatorPB.java, DatanodeProtocolServerSideTranslatorPB.java三个类。除此之外,还有PB文件,路径在$HADOOP_SOURCE_HOME/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/。maven编译的时候会将相应的类生成到target目录下,并加入CLASSPATH中。


    1、DatanodeProtocol.proto 

PB文件,定义了message以及service,如果

NewImage

    PB文件,定义了message以及service,如果加入一个接口,需要在其内部定义rpc service。

    编辑好后需要通过protoc进行编译,使用maven默认的goal mvn generate-sources即可以。


    2、DatanodeProtocolPB.java

NewImage

 


    3、DatanodeProtocolClientSideTranslatorPB.java
    DatanodeProtocol两端Client是DataNode,向NameNode发送RPC请求,Server端是NameNode,接收请求,做出相应的处理,并把结构返回给DataNode。

    所以,顾名思义,DatanodeProtocolClientSideTranslatorPB就是在DataNode端将普通的请求,转化为PB格式的请求,发送给NameNode进行处理。

    比如:

NewImage

    下面的ReportBadBlocks,就是将pojo的blocks类,转化为PB格式,并通过底层Server类封装好的RPC发送给NameNode。

NewImage

    在DataNode部分,只需要关注逻辑,如红框所示,而不需要关注任何PB的细节,与1.x实现了兼容。


    4、DatanodeProtocolServerSideTranslatorPB.java

    与DatanodeProtocolClientSideTranslatorPB作用一样,其作用是将序列化为PB格式的类转化为POJO类,调用NameNode实现,并将结果返回给DataNode。

NewImage

 

    而NameNode部分,只需要将自身实现注册到DatanodeProtocolServerSideTranslatorPB即可。

NewImage
 
 

    综上,修改Hadoop2.x的源码需要经过以下几步:

    1、需改proto文件,并且通过maven编译

    2、需改clientTranslator和serverTranslator部分

    3、需改相应的POJO实现类即可

原文地址:https://www.cnblogs.com/sidmeng/p/3830908.html