为什么Hadoop需要引入这些新类?它们似乎使界面复杂化
为了以Hadoop方式处理对象。例如,Hadoop使用Text
而不是Java的String
。Hadoop中的Text
类类似于Java String
,但是Text
实现了Comparable
、Writable
和WritableComparable
等接口。
这些接口对于MapReduce都是必需的;Comparable
接口用于在化简器对键进行排序时进行比较,Writable
可以将结果写入本地磁盘。它不使用java Serializable
因为java Serializable
对于hadoop来说太大或太重,Writable
可以非常轻量级的方式序列化hadoop对象。
因为在大数据世界中,结构化对象需要序列化为字节流,以便通过网络移动或持久化到群集上的磁盘...然后根据需要再次反序列化。当您拥有像 Facebook 这样的海量数据需要存储和移动时,您的数据需要高效,并尽可能少地存储空间和移动时间。
String
和Integer
实在是太"胖"了。 Text
和 IntWritable
分别在表示相同类型信息的字节数组之上提供了更简单的抽象。
从 Apache 文档页面:
Writable
接口描述为
一个可序列化的对象,它实现了基于
DataInput
和DataOutput
的简单、高效的序列化协议。
有了这个新的 API,你就不会有并发症。这些新类的序列化过程crisp
且compact
。
为了提高Hadoop的有效性,应该优化序列化/反序列化过程,因为集群中的节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和可互操作的。由于这个原因,Hadoop框架提出了一个IO类来取代Java原始数据类型。例如 IntWritbale
用于int
,LongWritable
用于long
,Text
用于String
等。
您可以在Hadoop中找到有关此主题的更多详细信息 权威指南:第4版
更多好信息:
他们有两个相关的功能
它们具有"可写"接口 - 它们知道如何写入 DataOutput 流并从 DataInput 流中读取 - 显式。
它们通过 set() 操作更新其内容。这使您可以重复使用相同的值,而无需创建新实例。如果重复调用同一个映射器或化简器,效率会高得多:您只需在构造函数中创建可写实例并重用它们
相比之下,Java的Serializable框架"神奇地"序列化对象 - 但它以一种有点脆弱的方式进行序列化,并且通常无法读取由旧版本的类生成的值。 Java 对象流旨在发送回对象图——它必须记住已经推出的每个对象引用, 并在回来的路上做同样的事情。可写器件设计为独立式。
这是来自: http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/