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. Emacs阅读chm文档

    .title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...

  2. time_t

    所在的头文件为 time.h 定义为: #ifndef __TIME_T #define __TIME_T     /* 避免重复定义 time_t */ typedef long     time_ ...

  3. 读入一行字符给string类型

    小技巧 string ss: getline(cin,ss):

  4. Postgres数据库在Linux中的I/O优化

    I/O 优化1 打开 noatime方法: 修改 /etc/fstab2 调整预读方法: 查看 sudo blockdev --getra /dev/sda 设置 sudo blockdev --se ...

  5. Hololens 开发环境配置

    安装 Hololens SDK 转自 Vangos Pterneas, 4 Apr 2016 CPOL    5.00 (1 vote) vote 1vote 2vote 3vote 4vote 5 ...

  6. vs2010使用C

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  7. awk 用法小结

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  8. 在idea的maven项目使用el或jstl表达式

    必须加上这句: <%@ page isELIgnored="false" %> 否则无法解析el或jstl表达式 <%@ taglib prefix=" ...

  9. OpenGL红宝书第一个例子:绘制两个三角形

    1. 环境配置 在这里不在做环境配置的说明,因为网上可以找到很多类似的教程,如果有需要可以@我,我也希望能帮到大家,其它的不说了,先上我的代码 2. 第一个程序代码 创建LoadShader.h #p ...

  10. Oracle表和表数据恢复

    Oracle数据库表及表数据的恢复 1. 表恢复 对误删的表,只要没有使用 purge 永久删除选项,那么基本上是能从 flashback table 区恢复回来的. 数据表和其中的数据都是可以恢复回 ...