文章出处:http://www.cnblogs.com/liangzh/archive/2012/05/22/2512264.html

MultipleOutputFormat和MultipleOutputs

一,介绍

1,旧API中有 org.apache.hadoop.mapred.lib.MultipleOutputFormat和org.apache.hadoop.mapred.lib.MultipleOutputs

MultipleOutputFormat allowing to write the output data to different output files.

MultipleOutputs creates multiple OutputCollectors. Each OutputCollector can have its own OutputFormat and types for the key/value pair. Your MapReduce program will decide what to output to each OutputCollector.

2,新API中  org.apache.hadoop.mapreduce.lib.output.MultipleOutputs

整合了上面旧API两个的功能,没有了MultipleOutputFormat。

  The MultipleOutputs class simplifies writing output data to multiple outputs

  Case one: writing to additional outputs other than the job default output. Each additional output, or named output, may be configured with its own             OutputFormat, with its own key class and with its own value class.

  Case two: to write data to different files provided by user

下面这段话来自Hadoop:The.Definitive.Guide(3rd,Early.Release)P251

  “In the old MapReduce API there are two classes for producing multiple outputs: MultipleOutputFormat and MultipleOutputs. In a nutshell, MultipleOutputs is more fully featured, but MultipleOutputFormat has more control over the output directory structure and file naming. MultipleOutputs in the new API combines the best features of the two multiple output classes in the old API.”

二,应用

1,输出到多个文件或多个文件夹:

  驱动中不需要额外改变,只需要在MapClass或Reduce类中加入如下代码

  private MultipleOutputs<Text,IntWritable> mos;
  public void setup(Context context) throws IOException,InterruptedException {
    mos = new MultipleOutputs(context);
  }
  public void cleanup(Context context) throws IOException,InterruptedException {
    mos.close();
  }
  然后就可以用mos.write(Key key,Value value,String baseOutputPath)代替context.write(key, value);
  在MapClass或Reduce中使用,输出时也会有默认的文件part-m-00*或part-r-00*,不过这些文件是无内容的,大小为0. 而且只有part-m-00*会传给Reduce。

2,以多种格式输出:

public class TestwithMultipleOutputs extends Configured implements Tool {

  public static class MapClass extends Mapper<LongWritable,Text,Text,IntWritable> {

    private MultipleOutputs<Text,IntWritable> mos;

    protected void setup(Context context) throws IOException,InterruptedException {
      mos = new MultipleOutputs<Text,IntWritable>(context);
    }

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
      String line = value.toString();
      String[] tokens = line.split("-");

      mos.write("MOSInt",new Text(tokens[0]), new IntWritable(Integer.parseInt(tokens[1])));  //(第一处)
      mos.write("MOSText", new Text(tokens[0]),tokens[2]);     //(第二处)
      mos.write("MOSText", new Text(tokens[0]),line,tokens[0]+"/");  //(第三处)同时也可写到指定的文件或文件夹中
    }

    protected void cleanup(Context context) throws IOException,InterruptedException {
      mos.close();
    }

  }
  public int run(String[] args) throws Exception {

    Configuration conf = getConf();

    Job job = new Job(conf,"word count with MultipleOutputs");

    job.setJarByClass(TestwithMultipleOutputs.class);

    Path in = new Path(args[0]);
    Path out = new Path(args[1]);

    FileInputFormat.setInputPaths(job, in);
    FileOutputFormat.setOutputPath(job, out);

    job.setMapperClass(MapClass.class);
    job.setNumReduceTasks(0);  

    MultipleOutputs.addNamedOutput(job,"MOSInt",TextOutputFormat.class,Text.class,IntWritable.class);
    MultipleOutputs.addNamedOutput(job,"MOSText",TextOutputFormat.class,Text.class,Text.class);

    System.exit(job.waitForCompletion(true)?0:1);
    return 0;
  }

  public static void main(String[] args) throws Exception {

    int res = ToolRunner.run(new Configuration(), new TestwithMultipleOutputs(), args);
    System.exit(res);
  }

}

测试的数据:

abc-1232-hdf
abc-123-rtd
ioj-234-grjth
ntg-653-sdgfvd
kju-876-btyun
bhm-530-bhyt
hfter-45642-bhgf
bgrfg-8956-fmgh
jnhdf-8734-adfbgf
ntg-68763-nfhsdf
ntg-98634-dehuy
hfter-84567-drhuk

结果截图:(结果输出到/test/testMOSout)

遇到的一个问题:

  如果没有mos.close(), 程序运行中会出现异常:

  12/05/21 20:12:47 WARN hdfs.DFSClient: DataStreamer Exception:

  org.apache.hadoop.ipc.RemoteException:org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on
   /test/mosreduce/_temporary/_attempt_local_0001_r_000000_0/h-r-00000 File does not exist. [Lease. Holder: DFSClient_-352105532, pendingcreates: 5]

MultipleOutputFormat和MultipleOutputs相关推荐

  1. mapreduce多目录输出(MultipleOutputFormat和MultipleOutputs)

    一,介绍 1,旧API中有 org.apache.hadoop.mapred.lib.MultipleOutputFormat和org.apache.hadoop.mapred.lib.Multipl ...

  2. (转)MultipleOutputFormat和MultipleOutputs

    MultipleOutputFormat和MultipleOutputs http://www.cnblogs.com/liangzh/archive/2012/05/22/2512264.html ...

  3. 【hadoop】MultipleOutputFormat和MultipleOutputs

    一,介绍 1,旧API中有 org.apache.hadoop.mapred.lib.MultipleOutputFormat和org.apache.hadoop.mapred.lib.Multipl ...

  4. MultipleOutputs(三)

    一,介绍 1,旧API中有 org.apache.hadoop.mapred.lib.MultipleOutputFormat和org.apache.hadoop.mapred.lib.Multipl ...

  5. MapReduce入门

    说明 MapReduce是一种分布式计算模型,解决海量数据的计算问题,主要有Map和Reduce组成 用户使用时需要实现map()和reduce()两个函数,两个函数的形参都是key/value键值对 ...

  6. MapReduce中的自定义多目录/文件名输出HDFS

    转载自 http://my.oschina.net/leejun2005/blog/94706 最近考虑到这样一个需求: 需要把原始的日志文件用hadoop做清洗后,按业务线输出到不同的目录下去,以供 ...

  7. MapReduce中的自定义多目录/文件名输出转

    最近考虑到这样一个需求: 需要把原始的日志文件用hadoop做清洗后,按业务线输出到不同的目录下去,以供不同的部门业务线使用. 这个需求需要用到MultipleOutputFormat和Multipl ...

  8. Hadoop---(2)MapReduce(分布式计算编程模型)

    2. MapReduce MapReduce:是一种分布式计算编程模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MR由两个阶段组成:MapReduce,用户只需要实现map() ...

  9. Hadoop详解(三)——MapReduce原理和执行过程,远程Debug,Writable序列化接口,MapReduce程序编写

    MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和Re ...

最新文章

  1. 教你如何rEFIt-让你开机免按option!
  2. 让OA选型与实施不再苦口难言
  3. windows下利用sox批量将PCM转为WAV
  4. pyecharts第八节、雷达图
  5. 如何在VMWare的Ubuntu虚拟机中设置共享文件夹
  6. [BZOJ4542] [Hnoi2016] 大数 (莫队)
  7. 安装php_sqlsrv扩展
  8. SOUI实例之扫雷一
  9. TTL(UART)信号和RS232信号 对比
  10. Python基础笔记_Day10_Python面向对象、类和对象、__init__、__str__、访问限制、set、get
  11. STM32F103C8的keil环境配置和STlink烧录
  12. Win10 x64 安装Eplan P8 2.7 小结
  13. 改进维纳滤波的实现——光学稀疏孔径成像系统图像恢复算法研究 陈灏
  14. Python GDAL矢量转栅格详解
  15. phpStrom连接MySQL数据库
  16. 张居正-良心与理想-当年明月
  17. 2022.3.3总结+力扣258. 各位相加
  18. message:Error app.json app.json 未找到 public
  19. 赚下跌的钱!基金定投也能成千万富翁
  20. android ev3 蓝牙连接,手机蓝牙遥控EV3教程

热门文章

  1. 文件10:文件路径-信息查询方法
  2. 单目多帧自监督深度估计(2021-2022)研究进展
  3. 适用于Java开发人员的微服务:持续集成和持续交付
  4. windows升级新版本mysql
  5. 英特尔下代安腾芯片全面揭秘
  6. 【Linux】页表的深入分析
  7. mysql存储过程按区间_针对新手的MYSQL存储过程详解_CSDN_ChenF的博客-CSDN博客
  8. 如何准备校招技术面试+一只小菜鸟的面试之路
  9. 【高数】高数平面立体几何
  10. Python - 文本处理模块