《Hadoop权威指南:大数据的存储与分析》—5.3.4 序列化框架
5.3.4 序列化框架
尽管大多数MapReduce程序使用的都是Writable类型的键和值,但这并不是MapReduce API强制要求使用的。事实上,可以使用任何类型,只要能有一种机制对每个类型进行类型与二进制表示的来回转换就可以。
为了支持这一机制,Hadoop有一个针对可替换序列化框架(serialization framework)的API。序列化框架用一个Serialization实现(包含在org.apache.hadoop. io.serializer包中)来表示。例如,WritableSerialization类是对Writable类型的Serialization实现。
Serialization对象定义了从类型到Serializer实例(将对象转换为字节流)和Deserializer实例(将字节流转换为对象)的映射方式。
为了注册Serialization实现,需要将io.serizalizations属性设置为一个由逗号分隔的类名列表。它的默认值包括org.apache.hadoop.io.serializer. WritableSerialization和Avro指定(Specific)序列化及Reflect(自反)序列化类(详见12.1节),这意味着只有Writable对象和Avro对象才可以在外部序列化和反序列化。
Hadoop包含一个名为JavaSerialization的类,该类使用Java Object Serialization。尽管它方便了我们在MapReduce程序中使用标准的Java类型,如Integer或String,但不如Writable高效,所以不建议使用(参见以下的补充内容)。
序列化IDL
还有许多其他序列化框架从不同的角度来解决该问题:不通过代码来定义类型,而是使用“接口定义语言”(IDL,Interface Description Language)以不依赖于具体语言的方式进行声明。由此,系统能够为其他语言生成类型,这种形式能有效提高互操作能力。它们一般还会定义版本控制方案(使类型的演化直观易懂)。
两个比较流行的序列化框架Apache Thrift(http://thrift.apache.org/)和Google的Protocol Buffers (http://code.google.com/p/protobuf/),常常用作二进制数据的永久存储格式。MapReduce格式对该类的支持有限,[1] 但在Hadoop内部,部分组件仍使用上述两个序列化框架来实现RPC和数据交换。
Avro是一个基于IDL的序列化框架,非常适用于Hadoop的大规模数据处理。我们将在第12章讨论Avro。
为什么不用Java Object Serialization?
Java有自己的序列化机制,称为“Java Object Serialization”(通常简称为“Java Serialization”),该机制与编程语言紧密相关,所以我们很自然会问为什么不在Hadoop中使用该机制。针对这个问题,Doug Cutting是这样解释的:“为什么
开始设计Hadoop的时候我不用Java Serialization?因为它看起来太复杂,而我认为需要有一个至精至简的机制,可以用于精确控制对象的读和写,这个机制将是Hadoop的核心。使用Java Serialization虽然可以获得一些控制权,但用起来非常纠结。
不用RMI(Remote Method Invocation远程方法调用)也出于类似的考虑。高效、高性能的进程间通信是Hadoop的关键。我觉得我们需要精确控制连接、延迟和缓冲的处理方式,RMI对此无能为力。”
问题在于Java Serialization不满足先前列出的序列化格式标准:精简、快速、可扩展、支持互操作。
- 点赞
- 收藏
- 关注作者
评论(0)