【问题标题】:What is the reason for having Writable wrapper classes in Hadoop MapReduce for Java types?在 Java 类型的 Hadoop MapReduce 中有可写包装类的原因是什么?
【发布时间】:2013-06-16 17:17:59
【问题描述】:

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

【问题讨论】:

    标签: serialization hadoop mapreduce writable


    【解决方案1】:

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

    事实上,Hadoop 为Java Serializable 对象提供了一个(实验性的)序列化实现——只需配置序列化工厂即可使用它。默认的序列化机制是WritableSerialization,但可以通过设置以下配置属性来更改:

    io.serializations=org.apache.hadoop.io.serializer.JavaSerialization
    

    但请记住,任何需要可写(输入/输出格式、分区器、比较器)等的东西都需要替换为可以传递 Serializable 实例而不是 Writable 实例的版本。

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

    【讨论】:

    • 是的,我知道我可以更改序列化实现并且 Writable 序列化格式更优越。它仍然没有解释包装类的要求。哦,好吧,我认为这是在不直接询问 Hadoop 创建者之一的情况下我将得到的最佳答案。
    • 我想我不明白你在说“包装类的要求”时要问什么 - Writable 不是包装器,它是一个接口,表示对象符合某些'契约”,并且对象知道如何序列化自己
    • 我的意思是每个 java 类型都有它们的 Writable 包装类(int - IntWritable、string - TextWritable 等)。他们装饰 Java 类型以说明如何序列化它们。在编写映射器或减速器时,您必须拉出/解包/调用“get”方法来获取输入的 Java 类型,然后还要包装输出的 Java 类型。所有这些似乎都是不必要的。
    • 可以进行 WriteableSerialization,以便为每个 java 类型注册一个可写序列化程序,以便当它接收到要序列化的类型时,它会调用相应的序列化程序。这样,序列化对映射器和缩减器是完全透明的,您仍然可以从 Writables 提供的更精简的序列化中受益。这种为每种类型注册实现的设计模式被用于 Writables 提供的 RawComparator 功能,我只是不明白为什么他们没有为序列化功能做同样的事情。
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多