在Hadoop中,进程间通信是通过远程过程调用(RPC)实现的。RPC协议使用序列化将消息渲染为二进制流,并在接收方从二进制流反序列化为原始消息。为了提高Hadoop的效率,序列化/反序列化过程应该被优化,因为集群节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和互操作的。出于这个原因,Hadoop框架已经推出了一个IO类来替换Java原始数据类型。例如,IntWritable代表int,LongWritable代表long,Text代表String等。更多详情请参考《Hadoop权威指南》第四版。来自Apache website,Writable的目的如下所述: 一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于DataInput和DataOutput。
Java序列化要求在序列化格式中每个对象实例之前都加上类的哈希值前缀。因此,读取对象时不需要指定类名。但这会导致读取对象时产生额外开销,因为每个对象都可能是不同类的实例。在Hadoop序列化中,我们在检索数据时指定了类名。因此,我们不需要前缀,因为我们已经知道正在检索的内容。因此,我们设置了InputFormat。这提高了在RPC期间的速度和性能。