Yuh*_*hao 5 java serialization hadoop mapreduce
要实现Writable接口,可以在Hadoop中序列化对象.那么Hadoop Writable和java.io.serialization?之间的联系和区别是什么?
Tej*_*til 16
Java Serializable
Serializable不假设存储值的类是已知的,并且标记具有其类的实例,即.它写入有关对象的元数据,包括类名,字段名和类型,以及它的超类.ObjectOutputStream和ObjectInputStream稍微优化了这一点,因此在第一个类之后为类的实例编写了5个字节的句柄.但是随后无法随机访问带句柄的对象序列,因为它们依赖于流状态.这使排序变得复杂.
Hadoop可写
在定义"可写"时,您知道预期的类.因此,在反序列化时,Writable不会将它们的类型存储在序列化表示中,您知道预期的内容.例如.如果输入键是LongWritable,则要求空的LongWritable实例从输入数据流中填充自身.由于不需要存储元信息(类名,字段,类型,超类),因此可以实现更紧凑的二进制文件,直接的随机访问和更高的性能.
一些好的读物:
对于Java Serializable:
Hadoop可写
用 Doug Cutting 的话来说:
Writable 接口与 Serialized 接口略有不同。可序列化不假设存储值的类别是已知的。所以每个实例都用它的类来标记。ObjectOutputStream 和 ObjectInputStream 对此进行了一定程度的优化,以便在第一个类的实例之后为类的实例写入 5 字节句柄。但是带有句柄的对象序列不能随机访问,因为它们依赖于流状态。这使得排序之类的事情变得复杂。
另一方面,可写假设应用程序知道预期的类。应用程序必须能够创建实例才能调用 readFields()。因此类不需要与每个实例一起存储。这会产生更加紧凑的二进制文件、直接的随机访问以及通常更高的性能。
可以说 Hadoop 可以使用 Serialized。对于序列化对性能至关重要的每个类,可以重写 writeObject 或 writeExternal。(MapReduce 是 I/O 密集型的,因此几乎每个类的序列化都对性能至关重要。)可以实现 ObjectOutputStream.writeObjectOverride() 和 ObjectInputStream.readObjectOverride() 以使用更紧凑的表示,例如不需要标记每个类文件中的顶级实例及其类。这可能需要与 Haddop 在 Writable、ObjectWritable 等中所拥有的代码一样多的代码,并且代码会更复杂一些,因为它将尝试解决不同的类型模型。但它可能具有更好的内置版本控制的优势。或者会吗?
Serialized的版本机制是让类定义一个静态的名为serialVersionUID。这允许人们防止不兼容的更改,但不容易允许人们实现向后兼容性。为此,应用程序必须显式处理版本。它必须以特定于类的方式对阅读时编写的版本进行推理,以决定要做什么。但 Serializeable 的版本机制并不比 Writable 支持更多或更少。
您必须浏览该线程一次。
| 归档时间: |
|
| 查看次数: |
5533 次 |
| 最近记录: |