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

博客分类:http://tydldd.iteye.com/blog/2053867

 

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

使用步骤主要有三步:

1、在reduce或map类中创建MultipleOutputs对象,将结果输出

  1. class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{
  2. //将结果输出到多个文件或多个文件夹
  3. private MultipleOutputs<Text,IntWritable> mos;
  4. //创建对象
  5. protected void setup(Context context) throws IOException,InterruptedException {
  6. mos = new MultipleOutputs<Text, IntWritable>(context);
  7. }
  8. //关闭对象
  9. protected void cleanup(Context context) throws IOException,InterruptedException {
  10. mos.close();
  11. }
  12. }

2、在map或reduce方法中使用MultipleOutputs对象输出数据,代替congtext.write()

  1. protected void reduce(Text key, Iterable<IntWritable> values, Context context)
  2. throws IOException, InterruptedException {
  3. IntWritable V = new IntWritable();
  4. int sum = 0;
  5. for(IntWritable value : values){
  6. sum = sum + value.get();
  7. }
  8. System.out.println("word:" + key.toString() + "     sum = " + sum);
  9. V.set(sum);
  10. //使用MultipleOutputs对象输出数据
  11. if(key.toString().equals("hello")){
  12. mos.write("hello", key, V);
  13. }else if(key.toString().equals("world")){
  14. mos.write("world", key, V);
  15. }else if(key.toString().equals("hadoop")){
  16. //输出到hadoop/hadoopfile-r-00000文件
  17. mos.write("hadoopfile", key, V, "hadoop/");
  18. }
  19. }

3、在创建job时,定义附加的输出文件,这里的文件名称与第二步设置的文件名相同

  1. //定义附加的输出文件
  2. MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class);
  3. MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class);
  4. MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);

完整代码:

  1. package com.ru.hadoop.wordcount;
  2. import java.io.IOException;
  3. import java.net.URI;
  4. import java.net.URISyntaxException;
  5. import java.util.regex.Pattern;
  6. import org.apache.hadoop.conf.Configuration;
  7. import org.apache.hadoop.conf.Configured;
  8. import org.apache.hadoop.fs.FileSystem;
  9. import org.apache.hadoop.fs.Path;
  10. import org.apache.hadoop.io.IntWritable;
  11. import org.apache.hadoop.io.LongWritable;
  12. import org.apache.hadoop.io.NullWritable;
  13. import org.apache.hadoop.io.Text;
  14. import org.apache.hadoop.mapred.JobConf;
  15. import org.apache.hadoop.mapred.RecordWriter;
  16. import org.apache.hadoop.mapred.lib.MultipleOutputFormat;
  17. import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;
  18. import org.apache.hadoop.mapreduce.Job;
  19. import org.apache.hadoop.mapreduce.Mapper;
  20. import org.apache.hadoop.mapreduce.Reducer;
  21. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  22. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  23. import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
  24. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  25. import org.apache.hadoop.util.Progressable;
  26. public class WordCount2 extends Configured{
  27. public static void main(String[] args) {
  28. String in = "/home/nange/work/test/word/";
  29. String out = "hdfs://localhost:9000/hdfs/test/wordcount/out/";
  30. Job job;
  31. try {
  32. //删除hdfs目录
  33. WordCount2 wc2 = new WordCount2();
  34. wc2.removeDir(out);
  35. job = new Job(new Configuration(), "wordcount Job");
  36. job.setOutputKeyClass(Text.class);
  37. job.setOutputValueClass(IntWritable.class);
  38. job.setMapperClass(mapperString.class);
  39. //          job.setCombinerClass(reduceStatistics.class);
  40. job.setReducerClass(reduceStatistics.class);
  41. //定义附加的输出文件
  42. MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class);
  43. MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class);
  44. MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);
  45. FileInputFormat.addInputPath(job, new Path(in));
  46. FileOutputFormat.setOutputPath(job, new Path(out));
  47. job.waitForCompletion(true);
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. } catch (URISyntaxException e) {
  51. e.printStackTrace();
  52. } catch (ClassNotFoundException e) {
  53. e.printStackTrace();
  54. } catch (InterruptedException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. public void removeDir(String filePath) throws IOException, URISyntaxException{
  59. String url = "hdfs://localhost:9000";
  60. FileSystem fs  = FileSystem.get(new URI(url), new Configuration());
  61. fs.delete(new Path(filePath));
  62. }
  63. }
  64. /**
  65. * 重写maptask使用的map方法
  66. * @author nange
  67. *
  68. */
  69. class mapperString extends Mapper<LongWritable, Text, Text, IntWritable>{
  70. //设置正则表达式的编译表达形式
  71. public static Pattern PATTERN = Pattern.compile(" ");
  72. Text K = new Text();
  73. IntWritable V = new IntWritable(1);
  74. @Override
  75. protected void map(LongWritable key, Text value, Context context)
  76. throws IOException, InterruptedException {
  77. String[] words = PATTERN.split(value.toString());
  78. System.out.println("********" + value.toString());
  79. for(String word : words){
  80. K.set(word);
  81. context.write(K, V);
  82. }
  83. }
  84. }
  85. /**
  86. * 对单词做统计
  87. * @author nange
  88. *
  89. */
  90. class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{
  91. //将结果输出到多个文件或多个文件夹
  92. private MultipleOutputs<Text,IntWritable> mos;
  93. //创建MultipleOutputs对象
  94. protected void setup(Context context) throws IOException,InterruptedException {
  95. mos = new MultipleOutputs<Text, IntWritable>(context);
  96. }
  97. @Override
  98. protected void reduce(Text key, Iterable<IntWritable> values, Context context)
  99. throws IOException, InterruptedException {
  100. IntWritable V = new IntWritable();
  101. int sum = 0;
  102. for(IntWritable value : values){
  103. sum = sum + value.get();
  104. }
  105. System.out.println("word:" + key.toString() + "     sum = " + sum);
  106. V.set(sum);
  107. //使用MultipleOutputs对象输出数据
  108. if(key.toString().equals("hello")){
  109. mos.write("hello", key, V);
  110. }else if(key.toString().equals("world")){
  111. mos.write("world", key, V);
  112. }else if(key.toString().equals("hadoop")){
  113. //输出到hadoop/hadoopfile-r-00000文件
  114. mos.write("hadoopfile", key, V, "hadoop/");
  115. }
  116. }
  117. //关闭MultipleOutputs对象
  118. protected void cleanup(Context context) throws IOException,InterruptedException {
  119. mos.close();
  120. }
  121. }

hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹的更多相关文章

  1. java 写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中

    package com.beiwo.homework; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...

  2. Java递归输出指定路径下所有文件及文件夹

    package a.ab; import java.io.File; import java.io.IOException; public class AE { public static void ...

  3. Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例

    1. 需求:输出指定目录下的所以.java结尾文件的绝对路径的案例:  分析:  A:封装目录  B:获取该目录下的所有文件和文件夹的File数组  C:遍历这个File数组,得到每一个File对象的 ...

  4. php遍历目录输出目录及其下的所有图片文件

    在做网站的时候,需要给文章内所有的图片添加上logo,如何利用ThinkPHP来实现. ThinkPHP为我们很好的提供了图像处理类,给文章中的所有图片加上水印的思路,上传的图片文件都保存在一个文件夹 ...

  5. 将Maple输出的LaTex导出到txt文件

    将Maple输出的LaTex导出到txt文件 1. 生成LATEX Maple可以把它的表达式转换成LATEX, 使用latex命令即可: > latex(x^2+y^2=z^2); {x}^{ ...

  6. Python小代码_15_遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间

    遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间 import osimport datetime def print_tree(dir_path): for ...

  7. java代码实现输出指定以.java结尾的文件的绝对路径

    package 输出指定文件绝对路径; import java.io.File; /* * 需求:请大家把"E:\\JAVA语言"文件夹下全部的java结尾的文件的绝对路径给输出在 ...

  8. 如何在屏幕上查看命令的输出以及在Linux中写入文件

    在Linux中输出命令可以做很多事情(http://www.nanke0834.com) 您可以将命令的输出分配给变量,将其发送到另一个命令/程序以通过管道进行处理或将其重定向到文件以进行进一步分析. ...

  9. Linux命令nohup实现命令后台运行并输出到或记录到日志文件

    Linux命令nohup实现命令后台运行并输出到或记录到日志文件 导读 我们在调试程序的时候,免不了要去抓一些 log ,然后进行分析.如果 log 量不是很大的话,那很简单,只需简单的复制粘贴就好. ...

随机推荐

  1. 《Windows驱动开发技术详解》之自定义StartIO

    自定义StartIO 系统定义的StartIO队列只能使用一个队列(DDK提供的StartIO内部只有一个队列),这个队列将所有的IRP进行处理化.例如,读.写操作都会混在一起进行串行处理.然而,有时 ...

  2. 《JS权威指南学习总结--4.9.3in和instanceof运算符》

    内容要点: 一.in运算符 in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象.如果右侧的对象拥有一个名为左操作数数值的属性名,那么表达式返回true. 例如: va ...

  3. JS总结之一:字符串的调用方法

    字符串的调用方法:var s="hello, world";document.write(s.charAt(0)); //第一个字符document.write(s.charAt( ...

  4. linux中的 tar命令的 -C 参数,以及其它一些参数(转)

    linux中的 tar命令的 -C 参数,以及其它一些参数 复制源:http://www.cnblogs.com/li-hao/archive/2011/10/03/2198480.htmltar命令 ...

  5. OpenCV——运用于pixels war游戏

    // The "Square Detector" program. // It loads several images sequentially and tries to fin ...

  6. 第3章 Java语言基础----static

    1.static只能声明成员变量,不能声明局部变量,如下图所示: 2.如果变量在类中用static中定义过,那么在方法中就可以直接赋值了:如果没有在类中定义,则不能在方法中使用,还得重新定义,如下图所 ...

  7. ecshop 去版权

    与官网通信的几个地方: 1,打开admin/templates/index.htm,查找并删除 <frameset rows="0, 0" framespacing=&quo ...

  8. ActionBar更改背景颜色(主题)

    1.默认是黑色的背景, 2.更改主题theme为Theme.AppCompat.Light即可,清单文件主题如下: <application android:name="com.ith ...

  9. linq中first() firstordefault() last() lastOrDefault() single() singleOrDeafult

    一.firstordefault() 和 first() class Program { static void Main(string[] args) { List<Emp> list ...

  10. C++11 半同步半异步线程池的实现

    #include <list> #include <mutex> #include <thread> #include <condition_variable ...