谁能给我解释一下:
Hadoop中的Writable和Writable Comparable接口是什么?
这两者有什么不同?
请举例说明。
提前致谢
Writable在Hadoop中的接口和Hadoop中的类型必须实现这个接口。Hadoop为几乎所有的Java基本类型和其他一些类型提供了这些可写的包装器,但有时我们需要传递自定义对象,这些自定义对象应该实现Hadoop的可写接口。Hadoop MapReduce使用Writables实现与用户提供的mapper和reducer进行交互。
实现Writable接口需要两个方法:
public interface Writable {
void readFields(DataInput in);
void write(DataOutput out);
}
为什么使用Hadoop Writable ?
我们已经知道,在分布式计算环境中,数据需要在不同的节点之间传输。这需要对数据进行序列化和反序列化,以将结构化格式的数据转换为字节流,反之亦然。因此,Hadoop使用简单高效的序列化协议来序列化map和reduce阶段之间的数据,这些阶段被称为Writable(s)。前面已经提到的一些可写的例子是intwwritable, LongWritable, BooleanWritable和FloatWritable。
参考:https://developer.yahoo.com/hadoop/tutorial/module5.html例如
WritableComparable接口只是Writable和java.lang.Comparable接口的子接口。为了实现WritableComparable,除了readFields和write方法之外,还必须有compareTo方法,如下所示:
public interface WritableComparable extends Writable, Comparable
{
void readFields(DataInput in);
void write(DataOutput out);
int compareTo(WritableComparable o)
}
类型的比较对于MapReduce来说是至关重要的,在MapReduce中有一个排序阶段,在这个阶段中键之间会进行比较。
为WritableComparables实现一个比较器,比如org.apache.hadoop.io.RawComparator接口,肯定会帮助你加速Map/Reduce (MR)作业。您可能还记得,MR作业由接收和发送键值对组成。流程如下所示。
(K1,V1) –> Map –> (K2,V2)
(K2,List[V2]) –> Reduce –> (K3,V3)
键值对(K2、V2)称为中间键值对。它们从映射器传递到reducer。在这些中间键值对到达reducer之前,执行shuffle和排序步骤。
shuffle是将中间键(K2)分配给reducer, sort是对这些键进行排序。在本博客中,通过实现RawComparator来比较中间键,这项额外的工作将极大地改进排序。排序得到了改进,因为RawComparator将按字节比较键。如果我们不使用RawComparator,中间键必须完全反序列化才能执行比较。
注释(简写):
1)可写可比物可以相互比较,通常通过比较器进行比较。在Hadoop Map-Reduce框架中作为key的任何类型都应该实现这个接口。
2)在Hadoop Map-Reduce框架中作为值使用的任何类型都应该实现Writable接口
简而言之,在Hadoop中用作键的类型必须是WritableComparable
,而仅用作值的类型可以只是Writable
。
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T>
extends Writable, Comparable<T>
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Writable.html一个可写的也是可比较的。
WritableComparables可以相互比较,通常通过比较器。在Hadoop中用作键的任何类型Map-Reduce框架应该实现这个接口。
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Writable
一个可序列化的对象,它实现了一个简单、高效、序列化协议,基于DataInput和DataOutput。
Hadoop Map-Reduce框架实现的任何键或值类型这个接口。
Writable是一个接口,你需要实现hadoop map-reduce中使用的自定义类。有两个函数需要实现/重写:
write() and readFields();
然而,WritableComparable是Writable和Comparable的另一个子接口,需要实现/覆盖三个函数:
write() and readFields() | compareTo()
当我们需要实现compareTo()时,
so 类实现WritableComparable,可以在hadoop map-reduce中作为键或值使用。
但是,类实现Writable,只能在hadoop map-reduce中作为值使用。
你可以在官方网站找到这两个界面的例子:https://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/WritableComparable.html
https://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Writable.html