我想问为什么实现MapReduce分布式编程范例的Hadoop Framework在Java已经实现了我们使用的字符串时使用Text类来存储String?这看起来不必要多余(笑)。
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Text.html
答案 0 :(得分:4)
他们已经实现了自己的类Text for String,LongWritable for Long,IntWritable for Integers。
添加这些类的目的是为优化的网络序列化定义自己的基本类型。这些可以在org.apache.hadoop.io包中找到。
此类型生成紧凑的序列化对象,以充分利用网络带宽。 Hadoop旨在处理大数据,因此网络带宽是他们想要以非常有效的方式使用的最宝贵的资源。此外,与Java的本机类型相比,它们减少了这些对象的序列化和反序列化的开销。
答案 1 :(得分:1)
冗余???
让我说清楚。当我们谈论分布式系统时,高效的序列化/反序列化起着至关重要的作用。它出现在两个截然不同的分布式数据处理领域:
要特定于Hadoop,节点之间的IPC是使用RPC实现的。 RPC协议使用序列化将消息呈现为要发送到远程节点的二进制流,然后将二进制流反序列化为原始消息。因此,拥有一个可靠的序列化/反序列化框架以便有效地存储和处理大量数据非常重要。通常,RPC序列化格式最好是:
Hadoop使用自己的类型,因为开发人员希望存储格式紧凑(以便有效利用存储空间),快速(因此读取或写入的开销数TB的数据是最小的,可扩展的(因此我们可以透明地读取以旧格式编写的数据)和可互操作(因此我们可以使用不同的语言读取或写入持久数据) )。
在认为拥有专用的MapReduce类型是多余的之前,要记住几点:
HTH
答案 2 :(得分:0)
为什么我不能使用基本的String或Integer类?
Integer和String实现Java的标准Serializable接口。问题是MapReduce序列化/反序列化不使用此标准接口的值,而是自己的接口,称为可写接口。
The key and value classes have to be serializable by the framework and hence need to implement
the Writable interface. Additionally, the key classes have to implement the WritableComparable
interface to facilitate sorting by the framework.
的链接