Serialization 在Hadoop MapReduce中为Java类型提供可写包装器类的原因是什么?

Serialization 在Hadoop MapReduce中为Java类型提供可写包装器类的原因是什么?,serialization,hadoop,mapreduce,writable,Serialization,Hadoop,Mapreduce,Writable,在我看来,可以编写org.apache.hadoop.io.serializer.Serialization来直接序列化java类型,格式与包装器类将类型序列化为的格式相同。这样,映射器和还原器就不必处理包装器类。没有什么可以阻止您更改序列化以使用不同的机制,如java Serializable interface或类似thrift、协议缓冲区等 事实上,Hadoop附带了一个(实验性的)对象序列化实现——只需配置序列化工厂即可使用它。默认的序列化机制是writeableserializatio

在我看来,可以编写
org.apache.hadoop.io.serializer.Serialization
来直接序列化java类型,格式与包装器类将类型序列化为的格式相同。这样,映射器和还原器就不必处理包装器类。

没有什么可以阻止您更改序列化以使用不同的机制,如java Serializable interface或类似thrift、协议缓冲区等

事实上,Hadoop附带了一个(实验性的)对象序列化实现——只需配置序列化工厂即可使用它。默认的序列化机制是
writeableserialization
,但可以通过设置以下配置属性进行更改:

io.serializations=org.apache.hadoop.io.serializer.JavaSerialization
但是,请记住,任何需要可写(输入/输出格式、分区器、比较器)等的内容都需要替换为可通过
可序列化
实例而不是
可写
实例传递的版本

为好奇的读者提供更多链接:

  • -这似乎是一个与你所问的问题相似的问题,Tariq与Doug Cutting解释使用

是的,我知道我可以更改序列化实现,而且可写序列化格式更优越。它仍然没有解释包装类的需求。哦,好吧,我想这是最好的答案,我不会直接问Hadoop的创建者。我想我不明白你说的“包装类的要求”是什么意思——Writable不是包装,它是一个接口,表示对象符合某种“契约”,而且对象知道如何序列化它们自己。我要说的是,每种java类型都有可写的包装器类(int-int-writeable、string-textwriteable等)。它们修饰Java类型以说明如何序列化它们。在编写映射器或reducer时,必须拉出/展开/调用“get”方法来获取输入java类型,然后还要包装输出java类型。所有这些似乎都是不必要的。WriteableSerialization可以这样做,即为每个java类型向它注册一个可写序列化程序,以便当它接收到要序列化的类型时,调用相应的序列化程序。这样,序列化对映射器和还原器是完全透明的,您仍然可以从可写文件提供的更精简的序列化中获益。这种为每种类型注册实现的设计模式用于writeables提供的RawComparator功能,我只是不明白为什么它们不为序列化功能做同样的事情。