有时候我们想到这样的功能: 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
分享到:
相关推荐
- Hadoop提供了一个工具类`MultipleOutputs`,它可以方便地实现一个Reducer向多个文件写入数据的需求。 - 使用`MultipleOutputs`时,首先需要创建一个`MultipleOutputs`对象,并传入当前任务的上下文`Context`。 ...
Hadoop MultipleOutputs输出到多个文件中的实现方法 Hadoop MultipleOutputs是Hadoop MapReduce框架中的一种输出机制,可以将输出写入到多个文件中。下面将详细介绍Hadoop MultipleOutputs输出到多个文件中的实现...
然而,有时我们需要更精细地控制输出文件的命名,比如根据特定的键或值生成不同的文件,或者在一个Reducer中写出多个文件。这时,我们可以利用`MultipleOutputs`类来实现这个功能。 `MultipleOutputs`是Hadoop提供...
Hadoop大数据InvertedIndex文档倒排索引程序实验报告 ...该实验报告详细地介绍了使用Hadoop编程实现InvertedIndex文档倒排索引程序的整个过程,从实验目的到实验设计、实验内容和源码实现等多个方面。
有时可能要对输出的文件名进行控制或让每个reducer输出多个文件。MapReduce为此提供了MultipleOutputFormat类。 MultipleOutputFormat类可以将数据写到多个文件,这些文件的名称源于输出的键和值或者任意字符串。这...
在Hadoop 0.19.x版本中,提供了一个名为`MultipleOutputFormat`的类,它允许MapReduce任务输出多个文件并自定义文件名。但是,从Hadoop 0.20.x开始,`MultipleOutputFormat`及其所在包的类被标记为"已过时",这意味...
这个示例程序“Hadoop示例程序合并文件”旨在演示如何在Hadoop环境下整合多个文件,这对于理解Hadoop分布式文件系统(HDFS)的工作原理至关重要。下面将详细阐述Hadoop的核心组件、HDFS的特性以及如何在Hadoop环境中...
文档还详细讲解了如何使用Hadoop命令行工具提交MapReduce作业,包括如何指定mapper和reducer脚本路径、输入输出路径以及可能的作业参数。 #### 高级功能 除了基础的使用方法,文档还深入探讨了一些高级功能,如: ...
HDFS是一种分布式文件系统,它将大型数据集分割成小块并存储在集群中的多个节点上,保证了高可用性和容错性。MapReduce是Hadoop的数据处理模型,通过“映射”(map)和“化简”(reduce)两个阶段进行并行计算。 在...
Map阶段,Hadoop将输入文件分割成多个块,并在各个节点上并行处理。每个Map任务负责处理一个数据块,对其中的每一行进行分词,并生成键值对(单词作为键,出现次数为1作为值)。Reduce阶段则负责收集所有Map任务的...
综上所述,《hadoop 2.5 文档》涵盖了Hadoop的核心组件、编程接口、高级特性以及开发调试工具等多个方面,对于Hadoop开发人员来说是一份全面的学习资料。通过深入理解和掌握这些知识点,开发者能够更好地利用Hadoop...
3. **数据分布与容错**:HDFS自动将数据块复制到多个节点,提供高可用性和容错性。如果某个节点故障,HDFS会自动从其他节点恢复数据。 4. **HDFS Shell**:通过HDFS Shell,用户可以直接在命令行中对HDFS进行各种...
这个文件可能是 Hadoop 官方文档中关于 WordCount 示例的一个章节,详细介绍了如何编写 Map 和 Reduce 函数,以及如何配置和运行 WordCount 作业。可能包括了 Java 代码示例,讲解如何创建 MapReduce 程序,并将其...
Reducer阶段,它接收来自多个Mapper的相同键的值,将这些值求和,从而得到每个单词的总数量。最后,Reducer的输出会写回到HDFS,生成最终的单词计数结果。这个过程充分体现了Hadoop处理大数据的能力,即使面对海量...
- **MultipleInputs/MultipleOutputs**:Hadoop API提供的工具类,用于一个Job处理多个输入源或产生多个输出结果。 3. **参数传递**: - **JobConf**:每个Job都有自己的JobConf对象,可以通过设置conf属性将参数...
4. **Shuffle和Sort**:在MapReduce中, Shuffle阶段负责将Mapper的输出整理并分发给Reducer,Sort阶段则对数据进行排序。本地库文件优化了这两个过程,确保高效的数据传输和处理。 5. **Native HDFS缓存**:Hadoop...
- 数据分块:大文件被分割成多个小块,分布在不同的节点上。 - 数据复制:每个数据块都有多个副本,以确保容错性和可用性。 - Map阶段:数据块被加载到Mapper任务中进行处理,Mapper将输入数据转换为键值对。 - ...