如果这是一个愚蠢的问题,我很抱歉,但我找不到Google搜索的答案。
我如何理解LongWritable
类型?它是什么?任何人都可以链接到架构或其他有用的页面。
答案 0 :(得分:17)
Hadoop需要能够通过DataInput
和DataOutput
对象(通常是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文章
为了Hadoop的有效性,应优化序列化/反序列化过程,因为群集中的节点之间会发生大量远程调用。 So the serialization format should be fast, compact, extensible and interoperable
。由于这个原因,Hadoop框架已经提出了自己的IO类来替换java原始数据类型。例如IntWritbale
为int
,LongWritable
为long
,Text
为String
等。
如果您参考“Hadoop the definitive guide”第四版,您可以获得更多详细信息。