`
coderplay
  • 浏览: 575208 次
  • 性别: Icon_minigender_1
  • 来自: 广州杭州
社区版块
存档分类
最新评论

hadoop的reducer输出多个文件

阅读更多
有时候我们想到这样的功能: reducer能根据key(或value)值来输出多个文件,同一key(或value)处于同一个文件中。现在hadoop的0.17.x版本可以重写MultipleOutputFormat的generateFileNameForKeyValue就可以实现此功能。

比如:
package org.apache.hadoop.mapred.lib;

import java.io.IOException;

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.RecordWriter;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.util.Progressable;

public class MultipleTextOutputFormat<K extends WritableComparable, V extends Writable>
    extends MultipleOutputFormat<K, V> {

  private TextOutputFormat<K, V> theTextOutputFormat = null;

  @Override
  protected RecordWriter<K, V> getBaseRecordWriter(FileSystem fs, JobConf job,
      String name, Progressable arg3) throws IOException {
    if (theTextOutputFormat == null) {
      theTextOutputFormat = new TextOutputFormat<K, V>();
    }
    return theTextOutputFormat.getRecordWriter(fs, job, name, arg3);
  }

	@Override
	protected String generateFileNameForKeyValue(K key, V value, String name) {
		return name + "_" + value.toString();
	}
  
  
}


试一下wordcount这个例子,把WordCount.java的run函数加上一行
conf.setOutputFormat(org.apache.hadoop.mapred.lib.MultipleTextOutputFormat.class);

public int run(String[] args) throws Exception {
    JobConf conf = new JobConf(getConf(), WordCount.class);
    conf.setJobName("wordcount");
 
    // the keys are words (strings)
    conf.setOutputKeyClass(Text.class);
    // the values are counts (ints)
    conf.setOutputValueClass(IntWritable.class);
    
    conf.setMapperClass(MapClass.class);        
    conf.setCombinerClass(Reduce.class);
    conf.setReducerClass(Reduce.class);
    
    conf.setOutputFormat(org.apache.hadoop.mapred.lib.MultipleTextOutputFormat.class);
    
    List<String> other_args = new ArrayList<String>();
    for(int i=0; i < args.length; ++i) {
      try {
        if ("-m".equals(args[i])) {
          conf.setNumMapTasks(Integer.parseInt(args[++i]));
        } else if ("-r".equals(args[i])) {
          conf.setNumReduceTasks(Integer.parseInt(args[++i]));
        } else {
          other_args.add(args[i]);
        }
      } catch (NumberFormatException except) {
        System.out.println("ERROR: Integer expected instead of " + args[i]);
        return printUsage();
      } catch (ArrayIndexOutOfBoundsException except) {
        System.out.println("ERROR: Required parameter missing from " +
                           args[i-1]);
        return printUsage();
      }
    }
    // Make sure there are exactly 2 parameters left.
    if (other_args.size() != 2) {
      System.out.println("ERROR: Wrong number of parameters: " +
                         other_args.size() + " instead of 2.");
      return printUsage();
    }
    FileInputFormat.setInputPaths(conf, other_args.get(0));
    FileOutputFormat.setOutputPath(conf, new Path(other_args.get(1)));
        
    JobClient.runJob(conf);
    return 0;
  }


则使用
bin/hadoop jar build/hadoop-*-examples.jar wordcount conf  wordcount_output
可输出一个目录wordcount_output
$ls wordcount_output/
part-00000_1    part-00000_13   part-00000_16  part-00000_214  part-00000_28  part-00000_38  part-00000_5   part-00000_8
part-00000_10   part-00000_14   part-00000_17  part-00000_22   part-00000_29  part-00000_4   part-00000_6   part-00000_9
part-00000_102  part-00000_141  part-00000_19  part-00000_23   part-00000_3   part-00000_42  part-00000_62
part-00000_11   part-00000_143  part-00000_2   part-00000_24   part-00000_31  part-00000_44  part-00000_63
part-00000_117  part-00000_15   part-00000_20  part-00000_25   part-00000_35  part-00000_46  part-00000_7
part-00000_12   part-00000_152  part-00000_21  part-00000_26   part-00000_36  part-00000_47  part-00000_70
分享到:
评论
2 楼 coderplay 2009-04-24  
不是,放在你自己的jar包。 执行时加入到-classpath
1 楼 radarradar 2009-04-24  
菜鸟问下:修改了MultipleTextOutputFormat后怎么编译?这个编译完应该放到Hadoop-*-core.jar中吧?

相关推荐

    让一个reducer产生多个输出文件.docx

    - Hadoop提供了一个工具类`MultipleOutputs`,它可以方便地实现一个Reducer向多个文件写入数据的需求。 - 使用`MultipleOutputs`时,首先需要创建一个`MultipleOutputs`对象,并传入当前任务的上下文`Context`。 ...

    Hadoop MultipleOutputs输出到多个文件中的实现方法

    Hadoop MultipleOutputs输出到多个文件中的实现方法 Hadoop MultipleOutputs是Hadoop MapReduce框架中的一种输出机制,可以将输出写入到多个文件中。下面将详细介绍Hadoop MultipleOutputs输出到多个文件中的实现...

    Hadoop控制输出文件命名.docx

    然而,有时我们需要更精细地控制输出文件的命名,比如根据特定的键或值生成不同的文件,或者在一个Reducer中写出多个文件。这时,我们可以利用`MultipleOutputs`类来实现这个功能。 `MultipleOutputs`是Hadoop提供...

    大数据实验报告Hadoop编程实现InvertedIndex文档倒排索引程序附源码.doc

    Hadoop大数据InvertedIndex文档倒排索引程序实验报告 ...该实验报告详细地介绍了使用Hadoop编程实现InvertedIndex文档倒排索引程序的整个过程,从实验目的到实验设计、实验内容和源码实现等多个方面。

    Hadoop MapReduce多输出详细介绍

    有时可能要对输出的文件名进行控制或让每个reducer输出多个文件。MapReduce为此提供了MultipleOutputFormat类。 MultipleOutputFormat类可以将数据写到多个文件,这些文件的名称源于输出的键和值或者任意字符串。这...

    大数据与云计算培训学习资料 Hadoop的MapReduce中多文件输出 共9页.pdf

    在Hadoop 0.19.x版本中,提供了一个名为`MultipleOutputFormat`的类,它允许MapReduce任务输出多个文件并自定义文件名。但是,从Hadoop 0.20.x开始,`MultipleOutputFormat`及其所在包的类被标记为"已过时",这意味...

    Hadoop示例程序合并文件

    这个示例程序“Hadoop示例程序合并文件”旨在演示如何在Hadoop环境下整合多个文件,这对于理解Hadoop分布式文件系统(HDFS)的工作原理至关重要。下面将详细阐述Hadoop的核心组件、HDFS的特性以及如何在Hadoop环境中...

    Hadoop Streaming 官方中文文档

    文档还详细讲解了如何使用Hadoop命令行工具提交MapReduce作业,包括如何指定mapper和reducer脚本路径、输入输出路径以及可能的作业参数。 #### 高级功能 除了基础的使用方法,文档还深入探讨了一些高级功能,如: ...

    Hadoop 0.20.2 API文档

    HDFS是一种分布式文件系统,它将大型数据集分割成小块并存储在集群中的多个节点上,保证了高可用性和容错性。MapReduce是Hadoop的数据处理模型,通过“映射”(map)和“化简”(reduce)两个阶段进行并行计算。 在...

    hadoop学习之wordCount以及文件上传demo,经测试通过

    Map阶段,Hadoop将输入文件分割成多个块,并在各个节点上并行处理。每个Map任务负责处理一个数据块,对其中的每一行进行分词,并生成键值对(单词作为键,出现次数为1作为值)。Reduce阶段则负责收集所有Map任务的...

    hadoop 2.5 文档

    综上所述,《hadoop 2.5 文档》涵盖了Hadoop的核心组件、编程接口、高级特性以及开发调试工具等多个方面,对于Hadoop开发人员来说是一份全面的学习资料。通过深入理解和掌握这些知识点,开发者能够更好地利用Hadoop...

    Hadoop使用文档

    3. **数据分布与容错**:HDFS自动将数据块复制到多个节点,提供高可用性和容错性。如果某个节点故障,HDFS会自动从其他节点恢复数据。 4. **HDFS Shell**:通过HDFS Shell,用户可以直接在命令行中对HDFS进行各种...

    Hadoop mapreduce实现wordcount

    这个文件可能是 Hadoop 官方文档中关于 WordCount 示例的一个章节,详细介绍了如何编写 Map 和 Reduce 函数,以及如何配置和运行 WordCount 作业。可能包括了 Java 代码示例,讲解如何创建 MapReduce 程序,并将其...

    hadoop_hello_world

    Reducer阶段,它接收来自多个Mapper的相同键的值,将这些值求和,从而得到每个单词的总数量。最后,Reducer的输出会写回到HDFS,生成最终的单词计数结果。这个过程充分体现了Hadoop处理大数据的能力,即使面对海量...

    hadoop mapreduce多表关联join多个job相互依赖传递参数

    - **MultipleInputs/MultipleOutputs**:Hadoop API提供的工具类,用于一个Job处理多个输入源或产生多个输出结果。 3. **参数传递**: - **JobConf**:每个Job都有自己的JobConf对象,可以通过设置conf属性将参数...

    Hadoop64位库文件

    4. **Shuffle和Sort**:在MapReduce中, Shuffle阶段负责将Mapper的输出整理并分发给Reducer,Sort阶段则对数据进行排序。本地库文件优化了这两个过程,确保高效的数据传输和处理。 5. **Native HDFS缓存**:Hadoop...

    hadoop 入门

    - 数据分块:大文件被分割成多个小块,分布在不同的节点上。 - 数据复制:每个数据块都有多个副本,以确保容错性和可用性。 - Map阶段:数据块被加载到Mapper任务中进行处理,Mapper将输入数据转换为键值对。 - ...

Global site tag (gtag.js) - Google Analytics