用protobuf替换Hadoop中rpc的返回值

protobuf是谷歌开发的一套序列化结构化数据用以通讯协议,存储数据等的框架,支持c++、java、Python等语言。Hadoop 0.23及之后版本将使用protobuf实现rpc的序列化及反序列化。这里做了一个实验,在hadoop 0.19上实现用protobuf序列化/反序列一个rpc的返回值。

使用protobuf需要首先下载并安装,大概步骤是下载并解压tar包后,依次执行下面步骤:

[protobuf-2.4.1]$  ./configure

[protobuf-2.4.1]$ make

[protobuf-2.4.1]$ make check

[protobuf-2.4.1]$ make instal
l   # 该步骤需要root权限(sudo)

由于hadoop使用的java语言,需要到java目录下编译jar包,步骤如下:

[protobuf-2.4.1/java]$ mvn test  # 需要本地先安装maven哦

[protobuf-2.4.1/java]$ mvn install

[protobuf-2.4.1/java]$ mvn package #该步骤会在target目录上生成一个jar包,

                                                              #包名为:protobuf-java-2.4.1.jar 该jar包需要放到hadoop的lib目录下,

                                                              #供编译及运行时使用。


本地环境安装完后,下一步是写proto文件。为了方便,这里选择了用proto写ClusterStatus类,对应的proto文件内容如下:

  1. package mapred;  
  2.   
  3. option java_package = "org.apache.hadoop.mapred";  
  4.   
  5. option java_outer_classname = "ClusterStatusProtos";  
  6.   
  7. message ClusterStatus {  
  8.   
  9.   optional int32 task_trackers = 1;  
  10.   
  11.   optional int32 map_tasks = 2;  
  12.   
  13.   optional int32 reduce_tasks = 3;  
  14.   
  15.   optional int32 max_map_tasks = 4;  
  16.   
  17.   optional int32 max_reduce_tasks = 5;  
  18.   
  19.   
  20.   
  21.   enum JTState {  
  22.   
  23.     INITIALIZING = 0;  
  24.   
  25.     RUNNING = 1;  
  26.   
  27.   }  
  28.   
  29.   optional JTState state = 6;  
  30.   
  31. }
proto文件写好后,用protoc工具编译下生成对应的java文件,命令行如下:
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/my.proto

其实主要是用--java_out制定下生成的java文件放到哪里去。上面的proto文件编译后生成的文件为: org/apache/hadoop/mapred/ClusterStatusProtos.java。

相关推荐