Hadoop使用MultipleOutputs输出多文件或者指定命名
2017-08-03 14:27
471 查看
Hadoop使用MultipleOutputs输出多文件或者指定命名
@(HADOOP)[hadoop](一)输出多文件(未测试)
比如将不同国家的信息分别输出到一份对应的文件中。1、在reduce或map类中创建MultipleOutputs对象,将结果输出
class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{ //将结果输出到多个文件或多个文件夹 private MultipleOutputs<Text,IntWritable> mos; //创建对象 protected void setup(Context context) throws IOException,InterruptedException { mos = new MultipleOutputs<Text, IntWritable>(context); } //关闭对象 protected void cleanup(Context context) throws IOException,InterruptedException { mos.close(); } }
2、在map或reduce方法中使用MultipleOutputs对象输出数据,代替congtext.write()
Java代码 收藏代码
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { IntWritable V = new IntWritable(); int sum = 0; for(IntWritable value : values){ sum = sum + value.get(); } System.out.println("word:" + key.toString() + " sum = " + sum); V.set(sum); //使用MultipleOutputs对象输出数据 if(key.toString().equals("hello")){ mos.write("hello", key, V); }else if(key.toString().equals("world")){ mos.write("world", key, V); }else if(key.toString().equals("hadoop")){ //输出到hadoop/hadoopfile-r-00000文件 mos.write("hadoopfile", key, V, "hadoop/"); } }
3、在创建job时,定义附加的输出文件,这里的文件名称与第二步设置的文件名相同
Java代码 收藏代码
//定义附加的输出文件 MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);
(二)指定输出命名
1、创建变量
private static MultipleOutputs<Text, Text> mos;
2、初始化变量
在map或者reduce的setup()方法中初始化变量mos = new MultipleOutputs<Text, Text>(context);
3、使用变量代替context来write
在map()或者reduce()方法中使用mos作输出:mos.write("outputname", key, new Text(""));
4、关于变量传递
在主类中定义的变量,如定义了一个outputname,需要将其写入conf分发至其它nodemanager:Configuration conf = new Configuration(); //需要将变量分发至所有的nodemanager conf.set("outputname", outputName);
然后在map/reduce中从context获取这个变量:
context.getConfiguration().get("outputname")
5、关于part-**的输出
使用multioutput改变了默认的输出名称后,原有的part-**也会输出的,此时需要加上:import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat; LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);
这将在有内容写入文件时才创建文件,详细可看:http://stackoverflow.com/questions/14555313/renaming-part-files-in-hadoop-map-reduce
另外,即使不使用multiOutput,如果任务输出中有大量的空文件,也应加上这代码。x
相关文章推荐
- 如何使用Hadoop的MultipleOutputs进行多文件输出
- 如何使用Hadoop的MultipleOutputs进行多文件输出
- Hadoop 实例16-----MultipleOutputs实战:结果输出到多个文件夹或者文件中
- Hadoop控制输出文件命名 - MultipleOutputs
- Hadoop学习笔记———《MultipleOutputs———将结果输出到指定的多个文件或文件夹》
- CFileFind类遍历查找文件夹下的所有文件,或者指定文件,并使用ofstream输出到制定文本
- 使用for循环创建在指定目录下批量创建文件并重命名所有文件
- Hadoop控制输出文件命名
- hadoop输出控制,输出到指定文件中
- 使用seek()方法,将Hadoop文件系统中的一个文件在标准输出上显示两次
- hadoop之WordCoun输出文件用时间命名,避免每次运行都要修改
- mahout(或者hadoop)优先使用用户指定的classpath加载jar包
- 使用hadoop multipleOutputs对输出结果进行不一样的组织
- as通过gradle实现多渠道打包+使用配置文件进行版本管理+指定apk输出路径和apk文件名
- Delphi 在重命名文件或者文件夹时不能指定别的文件夹或者磁盘
- Hadoop MultipleOutputs 结果输出到多个文件夹 出现数据不全,部分文件为空
- Hadoop多文件输出:MultipleOutputFormat和MultipleOutputs深究
- Hadoop控制输出文件命名
- hadoop的MultipleOutputs多文件输出
- 控制Hadoop的reducer函数输出文件命名