MapReduce job中,可以使用FileInputFormat和FileOutputFormat来对输入路径和输出路径来进行设置。在输出目录中,框架自己会自动对输出文件进行命名和组织,如:part-(m|r)-00000之类。但有时为了后续流程的方便,我们常需要对输出结果进行一定的分类和组织。以前常用的方法是在MR job运行过后,用脚本对目录下的数据进行一次重新组织,变成我们需要的格式。研究了一下MR框架中的MultipleOutputs(是2.0之后的新API,是对老版本中MultipleOutputs与MultipleOutputFormat的一个整合)。

1. 需求,下面是有些测试数据,要对这些数据按类目输出到output中:

1512,iphone5s,4英寸,指纹识别,A7处理器,64位,M7协处理器,低功耗

1512,iphone5,4英寸,A6处理器,IOS7

1512,iphone4s,3.5英寸,A5处理器,双核,经典

50019780,ipad,9.7英寸,retina屏幕,丰富的应用

50019780,yoga,联想,待机18小时,外形独特

50019780,nexus 7,华硕&google,7英寸

50019780,ipad mini 2,retina显示屏,苹果,7.9英寸

1101,macbook air,苹果超薄,OS X mavericks

1101,macbook pro,苹果,OS X lion

1101,thinkpad yoga,联想,windows 8,超级本

2. API简介:

MutipleOutput是调用自己的writer方法来实现输出路径的定制的。首先来看看writer方法的几种重载方式:

(1). write(String namedOutput,Text key,IntWritable value) throws IOException,InterruptedException

讲key,value写入到以namedOutput开头的文件中,格式如:{namedOutput}-(m|r)-{part-number}

(2).write(Text key,IntWritable value,String baseOutputPath) throws IOException,InterruptedException

将key,value写入到baseOutputPath所指定的目录下,在目录下系统会自动为文件生成unique的文件名字;

(3).write(String namedOutput,Text key,Object value,String baseOutputPath) throws IOException,InterruptedException

应用在第1种和第2种需要共用的场景;

3. 下面来看一下代码,为了演示的简便只写了mapper函数,reducer同理:

需要引入:import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;

在setup函数中

实例化MultipleOutputs对象mlo:mlo = new MultipleOutputs<Text,Text>(context);

在map()函数中,根据逗号对输入数据进行分割,然后直接调用mlo进行输出;采用了两种形式进行输出。

要注意的是hadoop是不承认未经注册namedOutput的,必须先在主函数中注册,然后才能写入,否则运行时会报not defined错误;所以要在主函数中用MultipleOutputs.addNamedOutput将对应的namedOutput文件注册一下,告诉hadoop可以写入:MultipleOutputs.addNamedOutput(job,"MOSText",TextOutputFormat.class,Text.class,Text.class);

4. 运行这个数据后可以看到最终的数据结构目录如下:

(1) 其中/*/*/mlo/1101(隐私原因将具体名称隐去)、/*/*/mlo/1512、/*/*/mlo/50019780是对应:mlo.write(new Text(tokens[0]),new Text(line),outputPath + "/" + tokens[0]+ "/" ) 的按类目输出;

用hadoop fs -ls /*/*/mlo/1101看一下类目文件夹下面的结构如下:

Hadoop框架会自动文件夹下的输出指定unique name;

用hadoop fs -cat /*/*/mlo/1101/-m-00000查看如下:

(2)其中/*/*/mlo/MOSText-m-00000是对应:mlo.write("MOSText", new Text(tokens[0]),line)的输出,

用hadoop fs -cat /*/*/mlo/MOSText-m-00000查看如下:

包含我们所有的输入数据

(3)另一个/*/*/mlo/part-m-00000文件应该是hadoop自己生成的,由于我们没有使用context进行写入操作,这个文件是空的。

使用hadoop multipleOutputs对输出结果进行不一样的组织的更多相关文章

  1. Hadoop MultipleOutputs 结果输出到多个文件夹 出现数据不全,部分文件为空

    如题:出现下图中的情况(设置reduceNum=5) 感觉很奇怪,排除了很久,终于发现是一个第二次犯的错误:丢了这句 this.mOutputs.close(); 加上这句,一切恢复正常!

  2. hadoop多文件输出MultipleOutputFormat和MultipleOutputs

    1.MultipleOutputFormat可以将相似的记录输出到相同的数据集.在写每条记录之前,MultipleOutputFormat将调用generateFileNameForKeyValue方 ...

  3. hadoop streaming 多路输出 [转载]

    转载 http://www.cnblogs.com/shapherd/archive/2012/12/21/2827860.html hadoop 支持reduce多路输出的功能,一个reduce可以 ...

  4. hadoop多文件输出

    现实环境中,经常遇到一个问题就是想使用多个Reduce,可是迫于setup和cleanup在每个Reduce中会调用一次,仅仅能设置一个Reduce,无法是实现负载均衡. 问题,假设要在reduce中 ...

  5. hadoop之 mr输出到hbase

    1.注意问题: 1.在开发过程中一定要导入hbase源码中的lib库否则出现如下错误 TableMapReducUtil 找不到什么-- 2.编码: import java.io.IOExceptio ...

  6. hadoop通过java输出HAFS上的文件内容

    package org.apache.hadoop.book;import java.io.InputStream;import java.net.URL;import org.apache.hado ...

  7. 9.2.1 hadoop mapreduce任务输出的默认排序

    任务的默认排序 MapTask和ReduceTask都会默认对数据按照key进行排序,不管逻辑上是否需要.默认是按照字典顺序排序,且实现该排序的方法是快速排序.但是map和reduce任务只能保证单个 ...

  8. hadoop multipleoutputs

    http://grepalex.com/2013/05/20/multipleoutputs-part1/ http://grepalex.com/2013/07/16/multipleoutputs ...

  9. hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹

    hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹 博客分类:http://tydldd.iteye.com/blog/2053867 hadoop   hadoop1 ...

随机推荐

  1. js时间差转为天数

    function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2006-12-18格式 var aDate, oDate1, oDate2, iDays aDa ...

  2. 求质数算法的N种境界[1] - 试除法和初级筛法

    ★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?>一文,以"求质数"作为例子,介绍了一些考察应聘者的经验.由于本文没有政治敏感内容,顺便就转贴到俺在CSD ...

  3. IE和主流浏览器

    1.添加事件 addEventListener 主流 attachEvent     IE 2.移除事件 removeEventListener detachEvent 3.获取事件对象 event ...

  4. [bootstrap] 基本css样式和组件

    一.基本css样式 01.全局设置 全局 font-size 是 14px,line-height 是 20px. 这些样式应用到了 <body> 和所有的段落上. 另外,对 <p& ...

  5. 数据库中Schema(模式)概念的理解

    在学习SQL的过程中,会遇到一个让你迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不 ...

  6. JavaScript设计模式的简单理解

    设计模式可以理解为一系列的代码框架,我觉得主要涉及封装的概念.把实现某一功能的代码段封装在函数中,可以方便调用,同时利于代码的复用,提高了代码的可维护性.下面简单介绍一下几种设计模式的个人感受. 1. ...

  7. hdu---(Tell me the area)(几何/三角形面积以及圆面积的一些知识)

    Tell me the area Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HTML5的 2D SVG和SVG DOM的学习笔记(1)

    (项目中要使用SVG,只好补充知识了) HTML体系中,最常用的绘制矢量图的技术是SVG和HTML5新增加的canvas元素.这两种技术都支持绘制矢量图和光栅图. 一.SVG概述 可缩放矢量图形(Sc ...

  9. Java多线程-新特征-阻塞队列ArrayBlockingQueue

    阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素 ...

  10. influxdb和boltDB简介——底层本质类似LMDB,MVCC+B+树

    influxdb influxdb是最新的一个时间序列数据库,最新一两年才产生,但已经拥有极高的人气.influxdb 是用Go写的,0.9版本的influxdb对于之前会有很大的改变,后端存储有Le ...