12

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

4

3 回答 3

22

Hadoop 需要能够通过对象(通常是 IO 流)将数据输入DataInput和输出 Java 类型。DataOutputWritable 类通过实现两个方法`write(DataOuput) 和 readFields(DataInput) 来做到这一点。

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

大多数时候(尤其是刚开始),您可以在精神上替换LongWritable->Long即它只是一个数字。如果您开始定义自己的数据类型,您将开始熟悉实现可写接口:

看起来像:

public interface Writable {

       public void write(DataOutput out) throws IOException;

       public void readFields(DataInput in) throws IOException;
}
于 2012-06-18T15:51:51.313 回答
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)。

于 2014-12-09T17:02:52.727 回答
4

从 Apache 文档页面

Writable被描述为:

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

LongWritable是长的 WritableComparable。

可写需求:

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

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

参考这两个帖子:

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 原始数据类型。例如IntWritbaleint,LongWritablelong,TextString

如果您参考“Hadoop 权威指南”第四版,您可以获得更多详细信息。

于 2016-06-21T15:05:51.883 回答