用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 install # 该步骤需要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文件内容如下:
- package mapred;
- option java_package = "org.apache.hadoop.mapred";
- option java_outer_classname = "ClusterStatusProtos";
- message ClusterStatus {
- optional int32 task_trackers = 1;
- optional int32 map_tasks = 2;
- optional int32 reduce_tasks = 3;
- optional int32 max_map_tasks = 4;
- optional int32 max_reduce_tasks = 5;
- enum JTState {
- INITIALIZING = 0;
- RUNNING = 1;
- }
- optional JTState state = 6;
- }
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/my.proto
其实主要是用--java_out制定下生成的java文件放到哪里去。上面的proto文件编译后生成的文件为: org/apache/hadoop/mapred/ClusterStatusProtos.java。