为什么Hadoop需要像Text或IntWritable这样的类而不是String或Integer?

时间:2013-10-18 03:22:56

标签: hadoop

为什么Hadoop需要引入这些新类?它们似乎使界面复杂化

4 个答案:

答案 0 :(得分:40)

为了以Hadoop方式处理对象。例如,hadoop使用Text而不是java String。 hadoop中的Text类与java String类似,但Text实现ComparableWritableWritableComparable等接口。

这些接口都是MapReduce所必需的; Comparable接口用于比较reducer对密钥进行排序的时间,Writable可以将结果写入本地磁盘。它不使用java Serializable,因为java Serializable对于hadoop而言太大或太重,Writable可以以非常轻的方式序列化hadoop对象。

答案 1 :(得分:29)

因为在大数据世界中,需要将结构化对象序列化为字节流,以便通过网络移动或持久保存到群集上的磁盘......然后根据需要再次反序列化。如果您有大量的Facebook数据存储和移动数据,您的数据需要高效,并尽可能少地存储和移动时间。

StringInteger太“胖了”。 TextIntWritable分别在表示相同类型信息的字节数组之上提供了更容易的抽象。

答案 2 :(得分:2)

来自Apache文档page

Writable接口被描述为

  

基于DataInputDataOutput实现 简单,高效,序列化协议 的可序列化对象。

使用这个新API,您没有并发症。使用这些新类的序列化过程为crispcompact

为了Hadoop的有效性,应优化序列化/反序列化过程,因为群集中的节点之间会发生大量远程调用。因此,序列化格式应 快速,紧凑,可扩展且可互操作 。由于这个原因,Hadoop框架提出了一个IO类来替换java原始数据类型。例如IntWritbaleintLongWritablelongTextString等。

您可以在 Hadoop中找到有关此主题的更多详细信息权威指南:第4版

答案 3 :(得分:1)

更多信息:

他们有两个相关的功能

他们拥有“可写”界面 - 他们知道如何写入DataOutput流并明确地从DataInput流中读取。

他们通过set()操作更新内容。这使您可以重复使用相同的值,而无需创建新实例。如果重复调用相同的mapper或reducer,它会更高效:你只需在构造函数中创建可写的实例并重用它们

相比之下,Java的Serializable框架“神奇地”序列化对象 - 但它以一种有点脆弱的方式执行它,并且通常无法读取由旧版本的类生成的值。 Java对象流被设计为发送对象的图形 - 必须记住已经推出的每个对象引用,并在返回的路上执行相同的操作。可写的设计是独立的。

来自:http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/