`
cloudtech
  • 浏览: 4610165 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

用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文件内容如下:


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。

下一步是修改ClusterStatus.java文件,为了不需要改变ObjectWritable.java中hadoop对象的序列化方式,我们在ClusterStatus类中包装了一个ClusterStatusProtos.ClusterStatus.Builder对象status,去掉该类的所有成员变量并把所有接口改为操作status对象,对应的diff文件如下:


需要注意的是,由于protobuf在输入或输出时只接受InputStream/OutputStream对象,而hadoop的输入流是DataOutput/DataInput,这就需要进行转换。对于DataOutput到OutputStream的转换,采用HADOOP-7379的DataOutputOutputStream.java的wrap方法,而DataInput到InputStream,则是通过强制转换实现的。然后调整JobTracker.java及LocalJobRunner.java等文件后,就可以编译通过并运行了。

遗憾的是,修改后没能测试性能优势。


可能遇见的问题:

编译报错或运行时错误,提示类或方法找不到。

解决方案:

1、确保protobuf-java-2.4.1.jar包已经放到hadoop的lib目录下了;

2、全量编译:ant clean; ant。


参考资料:

1、http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

2、https://issues.apache.org/jira/browse/HADOOP-7379

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics