为什么MapReduce不能使用Java原始数据类型?

3

我正在学习Hadoop MapReduce框架。我很困惑为什么在MapReduce中不能使用Java原始数据类型。


很可能是因为数据传递的方式。在许多地方,您需要对象(并且需要针对基元进行特殊处理)。但是:这重要吗? - Thilo
2个回答

3
在Hadoop中,进程间通信是通过远程过程调用(RPC)实现的。RPC协议使用序列化将消息渲染为二进制流,并在接收方从二进制流反序列化为原始消息。
为了提高Hadoop的效率,序列化/反序列化过程应该被优化,因为集群节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和互操作的。出于这个原因,Hadoop框架已经推出了一个IO类来替换Java原始数据类型。例如,IntWritable代表int,LongWritable代表long,Text代表String等。
更多详情请参考《Hadoop权威指南》第四版。
来自Apache websiteWritable的目的如下所述: 一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于DataInput和DataOutput。

谢谢您的回复,非常有帮助。 - rraghuva

3
Java序列化要求在序列化格式中每个对象实例之前都加上类的哈希值前缀。因此,读取对象时不需要指定类名。但这会导致读取对象时产生额外开销,因为每个对象都可能是不同类的实例。
在Hadoop序列化中,我们在检索数据时指定了类名。因此,我们不需要前缀,因为我们已经知道正在检索的内容。因此,我们设置了InputFormat。这提高了在RPC期间的速度和性能。

谢谢您的回复,非常有帮助。 - rraghuva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接