• 大数据学习——Hadoop序列化


    一、序列化概述

    1)什么是序列化

    序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。

    反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。

    2)为什么要序列化

    一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。

    3)为什么不用Java的序列化

    Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)。

    4)Hadoop序列化特点

    • 紧凑 :高效使用存储空间。
    • 快速:读写数据的额外开销小。
    • 互操作:支持多语言的交互

    二、自定义bean对象实现序列化接口(Writable)

    在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在Hadoop框架内部传递一个bean对象,那么该对象就需要实现序列化接口。

    具体实现bean对象序列化步骤如下:

    (1)必须实现Writable接口
    (2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
    (3)重写序列化方法
    (4)重写反序列化方法
    (5)注意反序列化的顺序和序列化的顺序完全一致。
    (6)要想把结果显示在文件中,需要重写toString(),可用"\t"分开,方便后续用。

    三、序列化案例实操

    统计每一个手机号耗费的总上行流量、总下行流量、总流量

    输入数据
    在这里插入图片描述期望输出数据格式
    在这里插入图片描述

    需求分析

    在这里插入图片描述

    编写MapReduce程序

    package com.lhl.mapreduce.writeable;
    
    import org.apache.hadoop.io.Writable;
    
    import java.io.DataInput;
    import java.io.DataOutput;
    import java.io.IOException;
    
    
    /**
     * @ClassName: FlowBean
     * @author: lei lei
     * @date: 2022/08/23/9:50
     * @describe:
     */
    public class FlowBean implements Writable {
    
        private Long upFlow;
        private Long downFlow;
        private Long sumFlow;
    
        public FlowBean() {
        }
    
        @Override
        public String toString() {
            return upFlow + "\t" + downFlow + "\t" + sumFlow;
        }
    
    
    
        public Long getUpFlow() {
            return upFlow;
        }
    
        public void setUpFlow(Long upFlow) {
            this.upFlow = upFlow;
        }
    
        public Long getDownFlow() {
            return downFlow;
        }
    
        public void setDownFlow(Long downFlow) {
            this.downFlow = downFlow;
        }
    
    
        @Override
        public void write(DataOutput dataOutput) throws IOException {
    
            dataOutput.writeLong(upFlow);
            dataOutput.writeLong(downFlow);
            dataOutput.writeLong(sumFlow);
    
        }
    
        @Override
        public void readFields(DataInput dataInput) throws IOException {
    
            upFlow = dataInput.readLong();
            downFlow = dataInput.readLong();
            sumFlow = dataInput.readLong();
    
        }
    
    
        public void setSumFlow() {
    
            sumFlow = upFlow + downFlow;
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    package com.lhl.mapreduce.writeable;
    
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    
    /**
     * @ClassName: FlowMapper
     * @author: lei lei
     * @date: 2022/08/23/9:48
     * @describe:
     */
    public class FlowMapper extends Mapper<LongWritable, Text, Text, FlowBean> {
    
        private Text keyOut = new Text();
        FlowBean valueOut = new FlowBean();
    
    
        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, FlowBean>.Context context) throws IOException, InterruptedException {
    
            String lineData = value.toString();
    
            String[] datas = lineData.split("\t");
    
            keyOut.set(datas[1]);
    
            valueOut.setUpFlow(Long.parseLong(datas[datas.length - 3]));
            valueOut.setDownFlow(Long.parseLong(datas[datas.length - 2]));
    
            valueOut.setSumFlow();
    
    
            context.write(keyOut, valueOut);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    package com.lhl.mapreduce.writeable;
    
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    /**
     * @ClassName:
     * @author: lei lei
     * @date: 2022/08/23/9:49
     * @describe:
     */
    public class FlowReducer extends Reducer<Text, FlowBean,Text,FlowBean> {
    
        private final FlowBean outValue = new FlowBean();
    
        @Override
        protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {
    
            Long totalUpFlow = 0L;
            Long totalDownFlow = 0L;
    
            for (FlowBean flowBean : values) {
    
                totalUpFlow += flowBean.getUpFlow();
                totalDownFlow += flowBean.getDownFlow();
    
            }
    
            outValue.setUpFlow(totalUpFlow);
            outValue.setDownFlow(totalDownFlow);
    
            outValue.setSumFlow();
    
            context.write(key,outValue);
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    package com.lhl.mapreduce.writeable;
    
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    import java.io.IOException;
    
    /**
     * @ClassName:
     * @author: lei lei
     * @date: 2022/08/23/9:50
     * @describe:
     */
    public class FlowDriver {
    
        public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
            // 声明配置对象
            Configuration conf = new Configuration();
            // 声明Job对象
            Job job = Job.getInstance(conf);
            // 指定当前Job的Mapper 和 Reducer
            job.setMapperClass(FlowMapper.class);
            job.setReducerClass(FlowReducer.class);
            // 指定Map端输出的key个value的类型
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(FlowBean.class);
            // 指定最终输出结果的key 和 value的类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(FlowBean.class);
            // 指定数据的输入输出路径
            FileInputFormat.addInputPath(job, new Path("E:\\Test\\phone_data"));
            FileOutputFormat.setOutputPath(job, new Path("E:\\Test\\phone_data_out1"));
            // 提交Job
            job.waitForCompletion(true);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    C Primer Plus(6) 中文版 第7章 C控制语句:分支和跳转 7.4 一个统计单词的程序
    echart宽度100px原因(解决el-tabs里的echarts图表宽度不自适应,只有100px问题)
    性能测试知识科普(一)
    阿里开源中间件一览
    海丝一号-中国-2020
    react之基于@reduxjs/toolkit使用react-redux
    LeetCode 0795. 区间子数组个数
    PyTorch搭建CNN实现视频动作分类任务
    专家呼吁:家长应承担起数字时代家庭教育新责任
    Minio上传文件ssl证书不受信任
  • 原文地址:https://blog.csdn.net/qq_43687583/article/details/126557035