如果这是一个愚蠢的问题,我很抱歉,但我无法通过 Google 搜索找到答案。我怎么能理解LongWritable
类型?它是什么?任何人都可以链接到架构或其他有用的页面。
3 回答
Hadoop 需要能够通过对象(通常是 IO 流)将数据输入DataInput
和输出 Java 类型。DataOutput
Writable 类通过实现两个方法`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;
}
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)。
从 Apache 文档页面,
Writable
被描述为:
基于 DataInput 和 DataOutput 实现简单、高效的序列化协议的可序列化对象。
LongWritable
是长的 WritableComparable。
可写需求:
在 Hadoop 中,进程间通信是通过远程过程调用 (RPC) 构建的。RPC 协议使用序列化将消息在发送方呈现为二进制流,并将在接收方从二进制流反序列化为原始消息。
Java 序列化在性能和效率方面有很多缺点。Java 序列化比在内存存储中使用要慢得多,并且往往会显着扩展对象的大小。Java 序列化也会产生很多垃圾。
参考这两个帖子:
dzone文章
为了 Hadoop 的有效性,应该优化序列化/反序列化过程,因为集群中的节点之间发生了大量的远程调用。So the serialization format should be fast, compact, extensible and interoperable
. 由于这个原因,Hadoop 框架提出了自己的 IO 类来替换 Java 原始数据类型。例如IntWritbale
为int
,LongWritable
为long
,Text
为String
等
如果您参考“Hadoop 权威指南”第四版,您可以获得更多详细信息。