1 rpc简介:
a) 远程过程调用,本质是不同机器之间socket通讯
b) 具体实现产品:rmi xml-rpc avro-rpc 等,
前两者使用时,实现比较复杂,并且相同数据量下序列化后的数量较大 影响机器之间的传输速度
c) rpc数据序列化在Hadoop圈子中比较出名的两个工具:
apache avro和google的protocol buffer
前者在Hadoop1中使用到, 后者在Hadoop2中使用到
此两者都支持多语言,传输数据速率也快,但是前者使用maven能直接生成代码,
后者生成代码麻烦使用自己工具还需要手工挪动
2 apache avro学习地址:
http://avro.apache.org/docs/current/gettingstartedjava.html
apache avro是说在rpc通讯时,使用avro这种数据序列化系统方式来实现数据传输
3 apache avro specification:
a) avro的规范 ,用于定义好序列化的格式
b) 写法解释:
user.avsc: 定义avro记录 文件结尾后缀为 .avsc
{"namespace": "example.avro", 定义包名
"type": "record", 定义类型 类比于Java的 interface class等形式
"name": "User", 定义类名
"fields": [ 定义属性
{"name": "name", "type": "string"}, 类比于 String name
{"name": "favorite_number", "type": ["int", "null"]}, 类比于 数组名favorite_number,数组值["int", "null"]
{"name": "favorite_color", "type": ["string", "null"]} 类比于 数组名favorite_color,数组值["string", "null"]
]
}
c) 如果定义更复杂格式的,参看: http://avro.apache.org/docs/current/spec.html#schema_primitive
d) avro序列化数据和java.io.serilized的区别:
avro ---> 顺丰
java.io.serilized ---> 平邮
4) 使用MAVEN生成user.avsc文件对应的Java对象:
a) eclipse内创建maven工程
b) 在pom.xml内增加 avro依赖和avro build文件:
org.apache.avro
avro
1.7.7
org.apache.avro
avro-ipc
1.7.7
org.apache.avro
avro-maven-plugin
1.7.7
generate-sources
schema 指定generate-sources生成方式格式参看schema格式
${project.basedir}/src/main/avro/
${project.basedir}/src/main/java/
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
UTF-8
1.6
true
c) 创建文件夹,注意是文件夹
src/main/avro/
将创建的user.avsc拷贝在里面去,保证文件夹内只有这一个文件,这样在生成代码时,
就会只将此文件生成JavaBean
这块配置在如下文件中体现到:
${project.basedir}/src/main/avro/
${project.basedir}/src/main/java/
e) 工程右键/run as/8Maven generate-sources 生成代码;
此时在src/main/java/example.avro下生成Java类 User,打开如下:
/**
* Autogenerated by Avro
*
* DO NOT EDIT DIRECTLY
*/
package example.avro;
@SuppressWarnings("all")
........
f) 测试如下:
public static void main(String[] args) {
User user = new User("zm",30,"red");
System.out.println(user);
}
{"name": "zm", "favorite_number": 30, "favorite_color": "red"}
上述案例和介绍参考官网链接: http://avro.apache.org/docs/current/gettingstartedjava.html
工程代码见附件: