序列化框架
Hadoop有一个API,专门用来替换序列化框架,不一定要使用Writable类型
1) 用Serialization来表示序列化框架,如WritableSerialization类,实现了接口org.apache.hadoop.io.serializer.Serialization,定义了序列化和反序列化
public interface Serialization<T> {
/**
* Allows clients to test whether this {@link Serialization}
* supports the given class.
*/
boolean accept(Class<?> c);
/**
* @return a {@link Serializer} for the given class.
*/
Serializer<T> getSerializer(Class<T> c);
/**
* @return a {@link Deserializer} for the given class.
*/
Deserializer<T> getDeserializer(Class<T> c);
}
public class WritableSerialization extends Configured
implements Serialization<Writable>{}
之后,还需要配置属性io.serizalizations设置类名 默认值包含WritableSerialization和Avro
2) Hadoop包含名为JavaSerialization的类,使用Java的对象序列化,不如Writable高效,不推荐使用
序列化IDL(Interface Description Language)
不通过代码使用序列化框架,而使用接口描述语言,不依赖于具体语言的方式声明,有效提高互操作能力
流行的序列化框架:Apache Thrift和Google的Protocol Buffers
MapReduce有限支持上述框架,但Hadoop内部实现有一部分还是使用了上述框架
Avro非常适用于MapReduce,之后会讲
为什么不用Java序列化功能?
不满足精简,快速,可扩展,支持互操作
自定义Writable集合
自定义Writable类型,完全控制二进制表示和排序
Writable是MapReduce数据路径的核心,所以调整二进制对性能有很大的好处