我一直在使用hadoop很长一段时间但是我不确定为什么Hadoop使用自己的数据类型而不是Java数据类型?我一直在网上搜索同样的东西,但没有任何帮助。请帮忙。
答案 0 :(得分:4)
简短回答是因为序列化和他们提供的反序列化性能。
长版:
使用Writables(Hadoop的数据类型)的主要好处在于它们的效率。与Java序列化相比,它本来是一个明显的替代选择,它们具有更紧凑的表示。 Writable不会将它们的类型存储在序列化表示中,因为在反序列化时,已知哪种类型是预期的。
以下是Hadoop权威指南的更详细摘录:
Java序列化不紧凑,实现
java.io.Serializable
或java.io.Externalizable
的类将其类名和对象表示写入流。同一个类的后续实例会为第一个匹配项写入一个引用句柄,该句柄只占用5个字节。但是,引用句柄不能与随机访问一起使用,因为引用类可能出现在前一个流中的任何位置 - 也就是说,存储在流中的状态。更糟糕的是,引用句柄对序列化流中的记录排序造成严重破坏,因为特定类的第一个记录是区分的,必须作为特殊情况处理。所有这些问题都可以通过不将类名写入流来避免,这就是Writable采用的方法。结果是格式比Java序列化要紧凑得多,并且随机访问和排序按预期工作,因为每条记录都独立于其他记录(因此没有流状态)。