9、自定义FileOutputFormat分类输出

1、需求

MR的map和reduce的输出路径默认就是FileOutPutFormat.setOutPutPath()指定的路径,但是有的时候代码需要对结果进行分类输出,比如错误的信息输出到一个文件中,而正确的输出到另一个文件中。这样就需要自定义去改写一个FileOutPutFormat类来分类指定。

2、自定义代码

  • 1、自定义outputFormat插件代码

      import org.apache.hadoop.fs.FSDataOutputStream;
      import org.apache.hadoop.fs.FileSystem;
      import org.apache.hadoop.fs.Path;
      import org.apache.hadoop.io.NullWritable;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.RecordWriter;
      import org.apache.hadoop.mapreduce.TaskAttemptContext;
      import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
      import java.io.IOException;
    
      /**
       * [@Author](https://my.oschina.net/arthor) liufu
       */
      public class MyOutPutFormat extends FileOutputFormat<Text, NullWritable> {
          [@Override](https://my.oschina.net/u/1162528)
          public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext context) throws IOException, InterruptedException {
              Path tocrawlPath = new Path("d:/flow/crawlout/tocrawl.log");
              Path enhancedPath = new Path("d:/flow/enhanced/enhanced.log");
              FileSystem fs = FileSystem.get(context.getConfiguration());
              FSDataOutputStream tocrawlOs = fs.create(tocrawlPath);
              FSDataOutputStream enhancedOs = fs.create(enhancedPath);
    
              return new MyRecordWriter(tocrawlOs,enhancedOs);
          }
    
          static class MyRecordWriter extends RecordWriter<Text, NullWritable>{
    
              FSDataOutputStream tocrawlOs = null;
              FSDataOutputStream enhancedOs = null;
              public MyRecordWriter(FSDataOutputStream tocrawlOs, FSDataOutputStream enhancedOs) {
                  this.tocrawlOs = tocrawlOs;
                  this.enhancedOs = enhancedOs;
              }
    
              /**
               * write方法是把mr程序输出的最后的结果kv写入外部存储系统的实现方法
               */
              [@Override](https://my.oschina.net/u/1162528)
              public void write(Text key, NullWritable value) throws IOException, InterruptedException {
                  if(key.toString().contains("tocrawl")){
                      tocrawlOs.write(key.toString().getBytes());
                  }else{
                      enhancedOs.write(key.toString().getBytes());
                  }
              }
              [@Override](https://my.oschina.net/u/1162528)
              public void close(TaskAttemptContext context) throws IOException, InterruptedException {
                  if(tocrawlOs!=null) tocrawlOs.close();
                  if(enhancedOs!=null) enhancedOs.close();
              }
          }
      }
    
  • 2、如何设置使用?

实现:(参考TextOutputFormat.class)

特别注意

第二句还是需要的?因为fileinputformat的最终结果还有一个secusses的文件,需要默认指定到哪里。

转载于:https://my.oschina.net/liufukin/blog/799166

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值