了解LongWritable

时间:2012-06-18 15:41:07

标签: java hadoop mapreduce

如果这是一个愚蠢的问题,我很抱歉,但我找不到Google搜索的答案。 我如何理解LongWritable类型?它是什么?任何人都可以链接到架构或其他有用的页面。

3 个答案:

答案 0 :(得分:17)

Hadoop需要能够通过DataInputDataOutput对象(通常是IO Streams)将数据输入和输出Java类型。 Writable类通过实现两个方法`write(DataOuput)和readFields(DataInput)来实现。

具体来说,LongWritable是一个包含java long的Writable类。

大部分时间(特别是刚刚开始)你可以在心理上取代LongWritable - > Long即它只是一个数字。如果您要定义自己的数据类型,您将开始熟悉实现可写接口:

看起来像是:

public interface Writable {

       public void write(DataOutput out) throws IOException;

       public void readFields(DataInput in) throws IOException;
}

答案 1 :(得分:5)

Mapper类是泛型类型,有四个形式类型参数,用于指定map函数的输入键,输入值,输出键和输出值类型。

public class MaxTemperatureMapper
    extends Mapper<LongWritable, Text, Text, IntWritable> {
     @Override
    public void map(LongWritable key, Text value, Context context)
                                throws IOException, InterruptedException {

    }
    @Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context)
    throws IOException, InterruptedException 
    {
    }

}

对于代码示例,输入键是长整数偏移量,输入值是一行文本。输出键为整数,输出值为整数。 Hadoop不是使用内置的Java类型,而是提供自己的一组基本类型,这些类型针对网络序列化进行了优化。这些可以在org.apache.hadoop.io包中找到。

这里我们使用LongWritable,它对应于Java Long,Text(如Java String)和IntWritable(如Java Integer)。

答案 2 :(得分:3)

来自Apache文档page

Writable被描述为:

  

serializable对象,它基于DataInput和DataOutput实现简单,高效的序列化协议。

LongWritable是长期的WritableComparable。

需要可写:

在Hadoop中,进程间通信是使用远程过程调用(RPC)构建的。 RPC协议使用序列化将消息呈现为发送方的二进制流,并将其从接收方的二进制流反序列化为原始消息。

Java Serialization在性能和效率方面存在许多缺点。 Java序列化比在内存存储中使用要慢得多,并且往往会显着扩展对象的大小。 Java Serialization也会造成大量垃圾。

参考这两篇文章:

dzone文章

https://softwareengineering.stackexchange.com/questions/191269/java-serialization-advantages-and-disadvantages-use-or-avoid

为了Hadoop的有效性,应优化序列化/反序列化过程,因为群集中的节点之间会发生大量远程调用。 So the serialization format should be fast, compact, extensible and interoperable。由于这个原因,Hadoop框架已经提出了自己的IO类来替换java原始数据类型。例如IntWritbaleintLongWritablelongTextString等。

如果您参考“Hadoop the definitive guide”第四版,您可以获得更多详细信息。