Hadoop中的可写和可写可比较



谁能给我解释一下:

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

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>

一个可写的也是可比较的。

WritableComparables可以相互比较,通常通过比较器。在Hadoop中用作键的任何类型Map-Reduce框架应该实现这个接口。
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Writable.html

@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

相关内容

  • 没有找到相关文章

最新更新