相對於1.x版本的Hadoop,2.x版本的Hadoop採用了Protocol Buffer做爲序列化反序列化工具,以及RPC通信工具。這樣當咱們對Hadoop源碼進行修改以前,就須要瞭解Hadoop 2.x的代碼結構和修改方法。java
幾個結構,以DatanodeProtocol舉列子:node
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中。maven
一、DatanodeProtocol.proto ide
PB文件,定義了message以及service,若是工具
PB文件,定義了message以及service,若是加入一個接口,須要在其內部定義rpc service。oop
編輯好後須要經過protoc進行編譯,使用maven默認的goal mvn generate-sources便可以。spa
二、DatanodeProtocolPB.javaserver
因此,顧名思義,DatanodeProtocolClientSideTranslatorPB就是在DataNode端將普通的請求,轉化爲PB格式的請求,發送給NameNode進行處理。繼承
好比:接口
下面的ReportBadBlocks,就是將pojo的blocks類,轉化爲PB格式,並經過底層Server類封裝好的RPC發送給NameNode。
在DataNode部分,只須要關注邏輯,如紅框所示,而不須要關注任何PB的細節,與1.x實現了兼容。
四、DatanodeProtocolServerSideTranslatorPB.java
與DatanodeProtocolClientSideTranslatorPB做用同樣,其做用是將序列化爲PB格式的類轉化爲POJO類,調用NameNode實現,並將結果返回給DataNode。
而NameNode部分,只須要將自身實現註冊到DatanodeProtocolServerSideTranslatorPB便可。
綜上,修改Hadoop2.x的源碼須要通過如下幾步:
一、需改proto文件,而且經過maven編譯
二、需改clientTranslator和serverTranslator部分
三、需改相應的POJO實現類便可