我对Hadoop数据流中的序列化感到有些困惑。假设我有一个如下定义的Java对象(该对象可能比我显示的要复杂得多):
public void MyObject {
private int Field1;
private String Field2;
public void method1() {
}
...
}
要在映射器和缩减器之间传输此对象的实例,有两种方法:
第一种方法 - 我可以在mapper中逐个序列化int字段和String字段并将它们写入输出,然后在reducers中,我读取它们并使用这些值创建MyObject
的新实例。假设新创建的实例与原始实例相比没有区别。
第二种方法 - 我可以重写MyObject
来实现Writable
接口,并在mappers中序列化整个实例。然后在reducers中,我只需要反序列化对象,我就可以使用它。
这两种方法有什么区别?在传输对象之前序列化对象有什么好处。
答案 0 :(得分:1)
与Java可序列化相比,Hadoop Writable
更紧凑,占用的空间更少。 Hadoop映射器和reducers处理扩展Hadoops的Writable
接口的对象。有关详细信息,请参阅https://stackoverflow.com/a/16839597/1150329