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. Linux设置开机服务自动启动

    [root@localhost ~]# chkconfig --list     显示开机可以自动启动的服务[root@localhost ~]# chkconfig --add ***  添加开机自 ...

  2. Chapter 2 Open Book——8

    But as far as I could tell, life worked that way most of the time. 但是即使我这么说,生活大多数时间还是这样的. 但就我所能告诉你的, ...

  3. js第一天 innerHTML和value 的区别

    innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容:如:<div id="aa">这是内容</div> ,我们可以通过 document ...

  4. 二分图匹配之KM求二分图最佳匹配算法

    参考网址:http://blog.163.com/suntroop@yeah/blog/static/17012103120115185927194/ 对于具有二部划分( V1, V2 )的加权完全二 ...

  5. 使用CodeFirst实现动态建库

    一.业务分析 以我们平时注册今目标为例,我们在注册今目标的过程中,具体步骤是这样的: 图1 今目标登陆流程 详细解释一下: 第一步:注册界面.输入手机号或者邮箱,点击确定进入基本信息界面. 第二步:基 ...

  6. .NET面试题目一

    简单介绍下ADO.NET和ADO主要有什么改进? 答:ADO以Recordset存储,而ADO.NET则以DataSet表示,ADO.NET提供了数据集和数据适配器,有利于实现分布式处理,降低了对数据 ...

  7. CentOS7 PostgreSQL 主从配置( 二)

    同步流复制配置PostgreSql的流复制是异步的,缺点是Standby上的数据落后于主库上的数据,如果使用Hot Standby做读写分离,就会存在数据一致性的问题.PostgreSql9.1版本后 ...

  8. 关于C++中虚函数表存放位置的思考

    其实这是我前一段时间思考过的一个问题,是在看<深入探索C++对象模型>这本书的时候我产生的一个疑问,最近在网上又看到类似的帖子,贴出来看看: 我看到了很多有意思的答案,都回答的比较好,下面 ...

  9. C# Socket的TCP通讯

    Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...

  10. scrollview上面的图片不上下滑动

    self.automaticallyAdjustsScrollViewInsets= NO;