HDFS Protocol修改流程
相对于1.x版本的Hadoop,2.x版本的Hadoop采用了Protocol Buffer作为序列化反序列化工具,以及RPC通讯工具。这样当我们对Hadoop源码进行修改之前,就需要了解Hadoop 2.x的代码结构和修改方法。
几个结构,以DatanodeProtocol举列子:
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,如果
PB文件,定义了message以及service,如果加入一个接口,需要在其内部定义rpc service。
编辑好后需要通过protoc进行编译,使用maven默认的goal mvn generate-sources即可以。
2、DatanodeProtocolPB.java
所以,顾名思义,DatanodeProtocolClientSideTranslatorPB就是在DataNode端将普通的请求,转化为PB格式的请求,发送给NameNode进行处理。
比如:
下面的ReportBadBlocks,就是将pojo的blocks类,转化为PB格式,并通过底层Server类封装好的RPC发送给NameNode。
在DataNode部分,只需要关注逻辑,如红框所示,而不需要关注任何PB的细节,与1.x实现了兼容。
4、DatanodeProtocolServerSideTranslatorPB.java
与DatanodeProtocolClientSideTranslatorPB作用一样,其作用是将序列化为PB格式的类转化为POJO类,调用NameNode实现,并将结果返回给DataNode。
而NameNode部分,只需要将自身实现注册到DatanodeProtocolServerSideTranslatorPB即可。
综上,修改Hadoop2.x的源码需要经过以下几步:
1、需改proto文件,并且通过maven编译
2、需改clientTranslator和serverTranslator部分
3、需改相应的POJO实现类即可