35

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

4

4 回答 4

47

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

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

于 2013-10-18T03:44:37.333 回答
31

因为在大数据世界中,结构化对象需要序列化为字节流,以便在网络上移动或持久化到集群上的磁盘……然后根据需要再次反序列化。当您拥有像 Facebook 规模的大量数据要存储和移动时,您的数据需要高效,并且需要尽可能少的存储空间和移动时间。

String而且Integer简直太“胖”了。TextIntWritable分别在表示相同类型信息的字节数组之上提供了更简单的抽象。

于 2013-10-18T03:49:03.737 回答
2

从 Apache 文档页面

Writable接口被描述为

一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于DataInputDataOutput

有了这个新的 API,您就不会遇到麻烦。这些新类的序列化过程是crispcompact.

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

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

于 2016-05-16T10:05:17.217 回答
1

一些更好的信息:

他们有两个相关的功能

他们有“可写”接口——他们知道如何显式地写入数据输出流并从数据输​​入流中读取。

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

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

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

于 2015-03-12T14:51:16.040 回答