26 MAPREDUCE中的序列化

简介: 26 MAPREDUCE中的序列化
概述

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系。。。。),不便于在网络中高效传输;

所以,hadoop自己开发了一套序列化机制Writable,精简,高效。

Jdk序列化和MR序列化之间的比较

简单代码验证两种序列化机制的差别:

public class TestSeri {
  public static void main(String[] args) throws Exception {
    //定义两个ByteArrayOutputStream,用来接收不同序列化机制的序列化结果
    ByteArrayOutputStream ba = new ByteArrayOutputStream();
    ByteArrayOutputStream ba2 = new ByteArrayOutputStream();
    //定义两个DataOutputStream,用于将普通对象进行jdk标准序列化
    DataOutputStream dout = new DataOutputStream(ba);
    DataOutputStream dout2 = new DataOutputStream(ba2);
    ObjectOutputStream obout = new ObjectOutputStream(dout2);
    //定义两个bean,作为序列化的源对象
    ItemBeanSer itemBeanSer = new ItemBeanSer(1000L, 89.9f);
    ItemBean itemBean = new ItemBean(1000L, 89.9f);
    //用于比较String类型和Text类型的序列化差别
    Text atext = new Text("a");
    // atext.write(dout);
    itemBean.write(dout);
    byte[] byteArray = ba.toByteArray();
    //比较序列化结果
    System.out.println(byteArray.length);
    for (byte b : byteArray) {
      System.out.print(b);
      System.out.print(":");
    }
    System.out.println("-----------------------");
    String astr = "a";
    // dout2.writeUTF(astr);
    obout.writeObject(itemBeanSer);
    byte[] byteArray2 = ba2.toByteArray();
    System.out.println(byteArray2.length);
    for (byte b : byteArray2) {
      System.out.print(b);
      System.out.print(":");
    }
  }
}
自定义对象实现MR中的序列化接口

如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:

public class FlowBean implements WritableComparable<FlowBean>

需要自己实现的方法是:

/**
   * 反序列化的方法,反序列化时,从流中读取到的各个字段的顺序应该与序列化时写出去的顺序保持一致
   */
  @Override
  public void readFields(DataInput in) throws IOException {
    upflow = in.readLong();
    dflow = in.readLong();
    sumflow = in.readLong();
  }
  /**
   * 序列化的方法
   */
  @Override
  public void write(DataOutput out) throws IOException {
    out.writeLong(upflow);
    out.writeLong(dflow);
    //可以考虑不序列化总流量,因为总流量是可以通过上行流量和下行流量计算出来的
    out.writeLong(sumflow);
  }
  @Override
  public int compareTo(FlowBean o) {
    //实现按照sumflow的大小倒序排序
    return sumflow>o.getSumflow()?-1:1;
  }


目录
相关文章
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
101 3
|
6月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
52 0
|
7月前
|
存储 分布式计算 Hadoop
MapReduce序列化【用户流量使用统计】
MapReduce序列化【用户流量使用统计】
|
分布式计算 资源调度 Hadoop
Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化
Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化
|
分布式计算
mapreduce辅助排序和序列化的实例练习
mapreduce辅助排序和序列化的实例练习
105 0
mapreduce辅助排序和序列化的实例练习
|
分布式计算 资源调度 Java
Hadoop中的MapReduce概述、优缺点、核心思想、编程规范、进程、官方WordCount源码、提交到集群测试、常用数据序列化类型、WordCount案例实操
Hadoop中的MapReduce概述、优缺点、核心思想、编程规范、进程、官方WordCount源码、提交到集群测试、常用数据序列化类型、WordCount案例实操
Hadoop中的MapReduce概述、优缺点、核心思想、编程规范、进程、官方WordCount源码、提交到集群测试、常用数据序列化类型、WordCount案例实操
|
存储 分布式计算 Hadoop
实现 MapReduce 框架的序列化
实现 MapReduce 框架的序列化
|
分布式计算 Hadoop 数据格式
【Hadoop】(四)Hadoop 序列化 及 MapReduce 序列化案例实操
【Hadoop】(四)Hadoop 序列化 及 MapReduce 序列化案例实操
252 0
【Hadoop】(四)Hadoop 序列化 及 MapReduce 序列化案例实操
|
分布式计算 数据挖掘
四十六、MapReduce之ProvincePartitioner案例实施(序列化案例实施)
四十六、MapReduce之ProvincePartitioner案例实施(序列化案例实施)
四十六、MapReduce之ProvincePartitioner案例实施(序列化案例实施)
|
存储 分布式计算 自然语言处理
三十四、MapReduce之FlowData案例(序列化案例实施)
三十四、MapReduce之FlowData案例(序列化案例实施)
三十四、MapReduce之FlowData案例(序列化案例实施)

热门文章

最新文章