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文件内容如下:
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
分享到:
相关推荐
基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现的Rpc框架.zip基于C++ module库 Protobuf Zookeeper 实现...
protobuf工具包,搭配hadoop使用,上传的资源为有用的
在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于C++ module库 Protobuf Zookeeper实现的Rpc框架源码+项目说明.zip 编译: `./autobuild....
基于protobuf 实现了一套RPC调用,UE4中可以使用,欢迎下载
hadoop protobuf2.5编译
PHP调用protobuf通信接口的使用示例,采用rpc通信。
A java ProtocolBuffers RPC implementation featuring bidirectional calls.
What is protobuf-rpc? protobuf-rpc是一个基于的远程方法调用(RPC))实现,服务器端当前仅支持Java(JDK 1.7及以上),客户端支持Objective-C(cocoa/iOS)和Java(J2SE/Android)。 Why protobuf-rpc? 对于纯的基于...
}服务示例{rpc Echo(Echo)返回(Echo){}}然后使用hrpc编译器npm install -g hrpc hrpc services.proto --rpc = rpc.js --messages = rpc-messages.js npm install对其进行编译--save hrpc-runtime#确保将其添加...
你可以在downloads/protobuf-socket-rpc-2.0.jar找到用Java 1.6编译的jar,或者你也可以下载源码直接使用。 您还需要在类路径中使用 google protobuf 库(版本 2.4.0)。 你可以从 Python Python egg 位于下载/...
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发...有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍。rpc的主要...
protobuf for unity 在unity中使用protobuf工程示例,数据的序列化和反序列化工程示例
Unity 中使用Protobuf进行序列化和反序列化的Demo
Twirp 一个带有protobuf服务定义的简单RPC框架
Google protobuf 官方文档中文翻译
这个是在erlang项目中使用google protobuf例子,配套文章地址http://blog.csdn.net/mycwq/article/details/21864191
Protocol Buffers(protobuf)是Google提供的一个开源序列化框架,这个demo将演示如何在Windows下VC++使用protobuf 配套文章地址:http://blog.csdn.net/mycwq/article/details/17606527
protobuf 在socket中运用 客户端 TestProtocolBufers电话薄例子 protobuf 源码库文件需要考到下面目录ClientTest