《Hadoop权威指南:大数据的存储与分析》—5.3.4 序列化框架

举报
清华大学出版社 发表于 2019/10/12 22:13:03 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第五章,第5.3.4节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

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. WritableSerializationAvro指定(Specific)序列化及Reflect(自反)序列化类(详见12.1),这意味着只有Writable对象和Avro对象才可以在外部序列化和反序列化。

Hadoop包含一个名为JavaSerialization的类,该类使用Java Object Serialization。尽管它方便了我们在MapReduce程序中使用标准的Java类型,如IntegerString,但不如Writable高效,所以不建议使用(参见以下的补充内容)

序列化IDL

还有许多其他序列化框架从不同的角度来解决该问题:不通过代码来定义类型,而是使用接口定义语言”(IDLInterface Description Language)以不依赖于具体语言的方式进行声明。由此,系统能够为其他语言生成类型,这种形式能有效提高互操作能力。它们一般还会定义版本控制方案(使类型的演化直观易懂)

两个比较流行的序列化框架Apache Thrift(http://thrift.apache.org/)GoogleProtocol 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不满足先前列出的序列化格式标准:精简、快速、可扩展、支持互操作。





【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。