Kun*_*l-G 23
可写在Hadoop中的接口和Hadoop中的类型必须实现此接口.Hadoop为几乎所有Java原始类型和其他类型提供了这些可写包装器,但有时我们需要传递自定义对象,这些自定义对象应该实现Hadoop的Writable接口.Hadoop MapReduce使用Writables的实现与用户提供的Mappers和Reducers进行交互.
要实现Writable接口,我们需要两个方法:
public interface Writable {
void readFields(DataInput in);
void write(DataOutput out);
}
Run Code Online (Sandbox Code Playgroud)
为什么要使用Hadoop Writable?
如我们所知,数据需要在分布式计算环境中的不同节点之间传输.这需要对数据进行序列化和反序列化,以将结构化格式的数据转换为字节流,反之亦然.因此,Hadoop使用简单有效的序列化协议在map和reduce阶段之间序列化数据,这些称为Writable(s).前面已经提到的一些可写的例子是IntWritable,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)
}
Run Code Online (Sandbox Code Playgroud)
类型的比较对于MapReduce至关重要,MapReduce存在一个排序阶段,在此阶段将密钥相互比较.
为org.apache.hadoop.io.RawComparator接口等WritableComparables实现比较器肯定有助于加速Map/Reduce(MR)作业.您可能还记得,MR作业由接收和发送键值对组成.该过程如下所示.
(K1,V1) –> Map –> (K2,V2)
(K2,List[V2]) –> Reduce –> (K3,V3)
Run Code Online (Sandbox Code Playgroud)
键值对(K2,V2)称为中间键值对.它们从映射器传递到reducer.在这些中间键值对到达减速器之前,执行混洗和分类步骤.
shuffle是将中间键(K2)分配给reducer,sort是对这些键的排序.在这篇博客中,通过实现RawComparator来比较中间键,这种额外的努力将极大地改善排序.排序得到改进,因为RawComparator将逐字节比较键.如果我们不使用RawComparator,则必须完全反序列化中间键以执行比较.
注(简称):
1)可写比较可以相互比较,通常通过比较器.在Hadoop Map-Reduce框架中用作密钥的任何类型都应该实现此接口.
2)在Hadoop Map-Reduce框架中用作值的任何类型都应该实现Writable接口.
简而言之,Hadoop 中用作键的类型必须是 a ,而仅用作值WritableComparable
的类型可以只是 a 。Writable
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/WritableComparable.html
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T>
extends Writable, Comparable<T>
Run Code Online (Sandbox Code Playgroud)
一个可写的,也是可比较的。
WritableComparables 可以相互比较,通常通过比较器。任何要在 Hadoop Map-Reduce 框架中用作键的类型都应该实现此接口。
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Writable.html
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Writable
Run Code Online (Sandbox Code Playgroud)
一个可序列化对象,它基于 DataInput 和 DataOutput 实现简单、高效的序列化协议。
Hadoop Map-Reduce 框架中的任何键或值类型都实现此接口。
归档时间: |
|
查看次数: |
16811 次 |
最近记录: |