我是靠谱客的博主 活泼菠萝,最近开发中收集的这篇文章主要介绍MapReduce中控制输出文件命名 & 单个reducer写出多个输出文件——MutipleOutputs,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
在MR job中,可以使用FileInputFormat和FileOutputFormat来对输入路径和输出路径进行设置。
在输出目录中,框架自己会自动对输出文件进行组织和命名:
一般情况下,Hadoop中每个Reducer对一个相同key的value做归并后,产生一个输出文件,并且文件以part-r-00000,part-r-00001的方式命名;
但是如果需要人为控制Reducer端输出文件名称(name-r-nnnnn命名,name是指定的名字,nnnnn是分区号),
或者一个Reducer输出多个文件,需要用到MR框架中的MutipleOutputs,用法如下。
1. 在Reducer类中,声明MutipleOutputs对象mos,指定泛型
private static class BitMapCalculationReducer extends Reducer<Text, Text, Text, Text> {
//泛型类型是Reducer端输出的k-v类型,也就是参数列表后两个
private MultipleOutputs<Text, Text> mos;
}
2. 在setup方法中,给mos对象配置上资源环境context
@Override
protected void setup(Context context) throws IOException, InterruptedException {
mos = new MultipleOutputs<>(context);
}
3. 在reduce方法中,使用mos.write(name,key,value,String baseOutputPath)代替context.write(key,value)输出
第一个参数name是文件名,key和outputValue都是Text类型
第四个参数指定输出文件目录,命名格式为baseOutputPath-r-nnnnn
输入和输出文件目录都是HDFS路径
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
mos.write("daytask", key, outputValue, outputDir);
}
4. 在cleanup方法中关闭输出流mos
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
try{
mos.close();
}catch (Exception e){
logger.error(e.getMessage());
}finally {
mos = null;
}
}
5. 在job类中,用addNamedOutput设置MutipleOutputs的输出文件类型
五个参数分别是:job、文件名、MR中输出文件类型(二进制)、输出key类型、输出value类型
@Override
public int run(String[] args) throws Exception {
设置job(conf)
MultipleOutputs.addNamedOutput(
job, "daytask", SequenceFileOutputFormat.class, Text.class, Text.class);
}
}
最后
以上就是活泼菠萝为你收集整理的MapReduce中控制输出文件命名 & 单个reducer写出多个输出文件——MutipleOutputs的全部内容,希望文章能够帮你解决MapReduce中控制输出文件命名 & 单个reducer写出多个输出文件——MutipleOutputs所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复