博客
关于我
【MapReduce】基础案例 ---- 自定义OutputFormat <根据内容输出到指定文件目录中>
阅读量:318 次
发布时间:2019-03-04

本文共 4040 字,大约阅读时间需要 13 分钟。

MR输出格式实现

在MapReduce(MR)框架中,OutputFormat是输出的基类,所有实现该接口的类都可以作为MR任务的输出格式。不同输出格式有不同的适用场景和特点。

常见的OutputFormat实现类

以下是几种常见的OutputFormat实现及其特点:

1. 文本输出(TestOutputFormat)

TestOutputFormat是默认的输出格式,它将每条记录写为文本行。其特点如下:

  • 支持任意键值类型,默认会调用toString()方法将键值转换为字符串
  • 输出格式紧凑,便于压缩和处理

2. SequenceFileOutputFormat

SequenceFileOutputFormat是一种紧凑的输出格式,通常用于作为后续MR任务的输入。其特点如下:

  • 输出格式紧凑,适合压缩
  • 适合作为后续MR任务的输入

3. 自定义OutputFormat

根据具体需求,可以实现自定义的OutputFormat。以下是自定义OutputFormat的实现步骤:

  • 继承自FileOutputFormat,并设置通用类型参数
  • 重写RecordWriter方法,创建自定义输出流
  • 根据需求定义输出规则,例如筛选输出
  • 确保正确关闭IO流

自定义OutputFormat示例

以下是一个自定义FilterOutputFormat的实现示例:

public class FilterOutputFormat extends FileOutputFormat {      @Override      public RecordWriter getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException {          return new FilterRecordWriter(job);      }  }

FilterRecordWriter的实现如下:

public class FilterRecordWriter extends RecordWriter {      private FSDataOutputStream fosAtguigu;      private FSDataOutputStream fosOther;      public FilterRecordWriter(TaskAttemptContext job) throws IOException {          try {              FileSystem fs = FileSystem.get(job.getConfiguration());              Path pathAtguigu = new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\OutputFormat数据输出\\atguigu.log");              fosAtguigu = fs.create(pathAtguigu);              Path pathOther = new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\OutputFormat数据输出\\other.log");              fosOther = fs.create(pathOther);          } catch (Exception e) {              e.printStackTrace();          }      }      @Override      public void write(Text key, NullWritable value) throws IOException, InterruptedException {          String keyStr = key.toString();          if (keyStr.contains("atguigu")) {              fosAtguigu.write(keyStr.getBytes());          } else {              fosOther.write(keyStr.getBytes());          }      }      @Override      public void close(TaskAttemptContext context) throws IOException, InterruptedException {          IOUtils.closeStream(fosAtguigu);          IOUtils.closeStream(fosOther);      }  }

Mapper阶段

在Mapper阶段,主要任务是读取数据并输出。以下是FilterMapper的实现:

public class FilterMapper extends Mapper {      @Override      protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {          context.write(value, NullWritable.get());      }  }

Reducer阶段

在Reducer阶段,主要任务是将读取的数据进行聚合并输出。以下是FilterReducer的实现:

public class FilterReducer extends Reducer, Text, NullWritable> {      @Override      protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {          String line = key.toString() + "\r\n";          Text k = new Text();          k.set(line);          for (NullWritable value : values) {              context.write(k, NullWritable.get());          }      }  }

Driver阶段

Driver阶段负责配置任务并提交Job。以下是FilterDriver的实现:

public class FilterDriver {      public static void main(String[] args) throws IOException, InterruptedException {          Configuration conf = new Configuration();          Job job = Job.getInstance(conf);          job.setMapperClass(FilterMapper.class);          job.setReducerClass(FilterReducer.class);          job.setJarByClass(FilterDriver.class);          job.setMapOutputKeyClass(Text.class);          job.setMapOutputValueClass(NullWritable.class);          job.setOutputKeyClass(Text.class);          job.setOutputValueClass(NullWritable.class);          job.setOutputFormatClass(FilterOutputFormat.class);          FileInputFormat.setInputPaths(job, new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\OutputFormat数据输出\\log.txt"));          FileOutputFormat.setOutputPath(job, new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\Filteroutput"));          boolean result = job.waitForCompletion(true);          System.exit(result ? 0 : 1);      }  }

注意事项

在配置Job时,虽然我们自定义了OutputFormat,但由于FileOutputFormat会默认输出_SUCCESS文件,因此需要手动指定输出目录。

转载地址:http://vueq.baihongyu.com/

你可能感兴趣的文章
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>