使用hadoop multipleOutputs对输出结果进行不一样的组织
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对输出结果进行不一样的组织的更多相关文章
- Hadoop MultipleOutputs 结果输出到多个文件夹  出现数据不全,部分文件为空
		
如题:出现下图中的情况(设置reduceNum=5) 感觉很奇怪,排除了很久,终于发现是一个第二次犯的错误:丢了这句 this.mOutputs.close(); 加上这句,一切恢复正常!
 - hadoop多文件输出MultipleOutputFormat和MultipleOutputs
		
1.MultipleOutputFormat可以将相似的记录输出到相同的数据集.在写每条记录之前,MultipleOutputFormat将调用generateFileNameForKeyValue方 ...
 - hadoop streaming 多路输出 [转载]
		
转载 http://www.cnblogs.com/shapherd/archive/2012/12/21/2827860.html hadoop 支持reduce多路输出的功能,一个reduce可以 ...
 - hadoop多文件输出
		
现实环境中,经常遇到一个问题就是想使用多个Reduce,可是迫于setup和cleanup在每个Reduce中会调用一次,仅仅能设置一个Reduce,无法是实现负载均衡. 问题,假设要在reduce中 ...
 - hadoop之 mr输出到hbase
		
1.注意问题: 1.在开发过程中一定要导入hbase源码中的lib库否则出现如下错误 TableMapReducUtil 找不到什么-- 2.编码: import java.io.IOExceptio ...
 - hadoop通过java输出HAFS上的文件内容
		
package org.apache.hadoop.book;import java.io.InputStream;import java.net.URL;import org.apache.hado ...
 - 9.2.1 hadoop mapreduce任务输出的默认排序
		
任务的默认排序 MapTask和ReduceTask都会默认对数据按照key进行排序,不管逻辑上是否需要.默认是按照字典顺序排序,且实现该排序的方法是快速排序.但是map和reduce任务只能保证单个 ...
 - hadoop multipleoutputs
		
http://grepalex.com/2013/05/20/multipleoutputs-part1/ http://grepalex.com/2013/07/16/multipleoutputs ...
 - hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹
		
hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹 博客分类:http://tydldd.iteye.com/blog/2053867 hadoop hadoop1 ...
 
随机推荐
- 应用  Middleware
			
主要应用场景:过滤HTTP请求 laravel本身自带了几个Middleware在app/http/middleware目录下面 然后在app/http/kernel.php中注册 自定义一个midd ...
 - javascript图片切换
			
JavaScript 图片滑动切换效果 作者:cloudgamer 时间: 2009-09-25 文档类型:原创 来自:蓝色理想 第 1 页 JavaScript 图片滑动切换效果 [1] 第 2 页 ...
 - 20145218 《Java程序设计》第二周学习总结
			
Java中的注释格式 单行注释 //注释文字 多行注释 /注释文字/ 文档注释 /**注释文字*/ 注释不仅仅是对代码进行解释,在上一篇博客中也写过,注释也可以用来检查程序中的错误,可以说是一个小窍门 ...
 - js高级程序设计(三)基本概念
			
数据类型 ECMAscript中有五种简单数据类型Undefined,Null,Boolean,Number,String 还有一种复杂数据类型Object. typeof操作符 typeof可能返回 ...
 - datagridview 中添加了一个button类型的列,怎么写button的事件
			
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
 - Eclipse管理Java工程(j2se/j2ee/maven)
			
Eclipse管理J2SE/J2EE(Maven)项目 eclipse是一个集成开发工具,有编译,运行,打包部署等功能.eclipse可以新建多种项目,不同的项目有不同的IDE层次结构,方便用户管理资 ...
 - ARM堆栈及特殊指令
			
ARM7支持四种堆栈模式:满递减(FD).满递增(FA).空递减(ED).空递增(EA) FD:堆栈地址从上往下递减,且指针指向最后一个入栈元素.FA:堆栈地址从下往上递增,且指针指向最后一个入栈元素 ...
 - OC 类别(分类)Categroy
			
Categroy类别,又称为扩展类,在类的原基础上扩展方法,且不可添加变量,如果扩展的方法与原始类中的方法相同,则会隐藏原始方法,且不可在扩展方法中通过super调用原始方法,这里与继承不同. 定义: ...
 - SQL Server 一列或多列重复数据的查询,删除
			
业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关 ...
 - 固定定位fixed(IE6)
			
position: fixed; left:200px; top:100px; _left:200px; _top:100px ...