MapReduce框架原理-OutputFormat

目录

一、OutputFormat概述

二、自定义OutputFormat

自定义OutputFormat的详细流程:

三、案例实操

案例一:存储数据到MySQL中

案例二:存储数据到HDFS本地指定文件夹中


一、OutputFormat概述

OutputFormat主要是用来指定MR程序的最终的输出数据格式 。

默认使用的是TextOutputFormat,默认是将数据一行写一条数据,并且把数据放到指定的输出目录下,以 part-r-xxxxx数字开头。并且默认情况下有几个ReduceTask就有几个结果文件产生

二、自定义OutputFormat

自定义OutputFormat的详细流程:

  1. 定义MyOutputFormat继承FileOutputFormat<T>,泛型传入的是Reducer的输出类型
  2. 重写里面的getRecordWriter()方法,这个方法需要返回一个RecordWriter对象。

    这个方法里面定义了最终文件输出到什么地方

  3. 创建一个RecordWriter对象,继承RecordWriter<T>,重写里面的两个方法:write()、close()。其中write()方法中需要定义想要将文件输出到什么地方去,在这个方法中定义输出数据地址和输出数据格式
  4. 在Driver中通过job.setOutputFormatClass()指定我们使用的是哪个OutputFormat实现类

注意】如果设置了分区,并且指定了ReduceTask的数量,那么根据以前所学的有多少个ReduceTask就会生成多少个结果文件,是因为默认使用的是TextOutputFormat实现类,这个实现类就是几个ReduceTask就有几个结果文件。但是如果我们自定义了OutputFormat,那么结果文件只有我们指明的地址,没有其他。

三、案例实操

案例一:存储数据到MySQL中

需求:将手机流量数据根据总流向升序输出到MySQL数据库中

代码:

  1. FlowOutputInformat.java
    public class FlowOutputFormat extends FileOutputFormat<FlowBean, NullWritable> {
        @Override
        public RecordWriter<FlowBean, NullWritable> getRecordWriter(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
            return new MyRecordWriter();
        }
    }
  2. MyRecordWriter.java
    public class MyRecordWriter extends RecordWriter<FlowBean, NullWritable> {
        /**
         * 需要在这个方法中定义输出格式、输出数据地址
         * @param flowBean:Reduce阶段输出数据Key值
         * @param nullWritable:Reduce阶段输出value值
         */
        @SneakyThrows
        @Override
        public void write(FlowBean flowBean, NullWritable nullWritable) throws IOException, InterruptedException {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sx_bigdata?serverTimezone=UTC", "root", "root");
            PreparedStatement preparedStatement = connection.prepareStatement("insert into phone_flow values (?, ?, ?, ?)");
            preparedStatement.setString(1, flowBean.getPhone());
            preparedStatement.setInt(2, flowBean.getUpFlow());
            preparedStatement.setInt(3, flowBean.getDownFlow());
            preparedStatement.setInt(4, flowBean.getSumFlow());
            int i = preparedStatement.executeUpdate();
            if (i > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
            connection.close();
            preparedStatement.close();
        }
    
        @Override
        public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
    
        }
  3. FlowDriver.java
    job.setOutputFormatClass(FlowOutputFormat.class);

案例二:存储数据到HDFS本地指定文件夹中

需求:将单词计数案例结果输出到本地,其中首字母为大写字母存储在/upper.txt目录下,首字母为小写字母存储在/lower.txt目录下

代码:

  1. MyOutputFormat.java
    public class MyOutputFormat extends FileOutputFormat<Text, LongWritable> {
        @SneakyThrows
        @Override
        public RecordWriter getRecordWriter(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
            return new MyRecordWriter(taskAttemptContext);
        }
    }
  2. MyRecordWriter.java
    public class MyRecordWriter extends RecordWriter<Text, LongWritable> {
        FSDataOutputStream fsDataOutputStream1;
        FSDataOutputStream fsDataOutputStream2;
        public MyRecordWriter(TaskAttemptContext taskAttemptContext) throws Exception {
            Configuration configuration = taskAttemptContext.getConfiguration();
            FileSystem fs = FileSystem.get(new URI("hdfs://192.168.218.55:9000"), configuration, "root");
            Path out1 = new Path("/test/school/upper.txt");
            Path out2 = new Path("/test/school/lower.txt");
            if (fs.exists(out1)) {
                fs.delete(out1, true);
            }
            if (fs.exists(out2)) {
                fs.delete(out2, true);
            }
            fsDataOutputStream1 = fs.create(out1);
            fsDataOutputStream2 = fs.create(out2);
        }
    
        @Override
        public void write(Text text, LongWritable longWritable) throws IOException, InterruptedException {
            char firstWord = text.toString().charAt(0);
            String line = text + "\t" + longWritable.get() + "\r\n";
            if (Character.isUpperCase(firstWord)) {
                fsDataOutputStream1.write(line.getBytes());
            } else {
                fsDataOutputStream2.write(line.getBytes());
            }
        }
    
        @Override
        public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
            if (fsDataOutputStream1 != null) {
                fsDataOutputStream1.close();
            }
            if (fsDataOutputStream2 != null) {
                fsDataOutputStream2.close();
            }
        }
    }
  3. FlowDriver.java
    job.setOutputFormatClass(MyOutputFormat.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hadoop-mapreduce-client-core是Hadoop分布式计算框架中的核心模块之一。它主要包含了Hadoop MapReduce的核心功能和API接口,是实现MapReduce编程模型的必备组件。 Hadoop MapReduce是一种用于大规模数据处理的编程模型,其核心思想是将大规模数据集分解成多个较小的数据块,分别在集群中的不同机器上进行处理,最后将结果整合。hadoop-mapreduce-client-core模块提供了与MapReduce相关的类和方法,方便开发者实现自定义的Map和Reduce任务。 具体来说,hadoop-mapreduce-client-core模块包含了以下重要组件和功能: 1. Job:Job表示一个MapReduce任务的定义和描述,包括输入路径、输出路径、Mapper和Reducer等。 2. Mapper:Mapper是MapReduce任务中的映射函数,它负责将输入数据转换成<key, value>键值对的形式。 3. Reducer:Reducer是MapReduce任务中的归约函数,它按照相同的key将所有Mapper输出的value进行聚合处理。 4. InputFormat:InputFormat负责将输入数据切分成多个InputSplit,每个InputSplit由一个Mapper负责处理。 5. OutputFormat:OutputFormat负责将Reducer的输出结果写入指定的输出路径中。 使用hadoop-mapreduce-client-core模块,开发者可以基于Hadoop分布式计算框架快速开发并行处理大规模数据的应用程序。通过编写自定义的Mapper和Reducer,可以实现各种类型的分布式计算,如数据清洗、聚合分析、机器学习等。 总之,hadoop-mapreduce-client-core是Hadoop分布式计算框架中的核心模块,提供了实现MapReduce编程模型所需的基本功能和API接口。使用该模块,开发者可以利用Hadoop的分布式计算能力,高效地处理和分析大规模数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值