当前位置: 首页 > 知识库问答 >
问题:

Hadoop:OutputCollector在MapReduce期间如何工作?

毋宸
2023-03-14

我想知道输出收集器的“实例”输出是否用于映射函数:output.collect(键,值)这个输出 - 是否在某个地方存储键值对?即使它发出到化简器函数,它们也必须是中间文件,对吧?这些文件是什么?它们是否可见并由编程者决定?我们在主函数中指定的输出密钥类和输出值类是这些存储位置吗?[文本.class和可写.class]

我给出了MapReduce中字数统计示例的标准代码,我们可以在网络中的许多地方找到它。

public class WordCount {

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}

public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));    
JobClient.runJob(conf);
}
}

共有3个答案

蓬英逸
2023-03-14

中间的分组输出总是存储在顺序文件中。应用程序可以通过JobConf指定是否以及如何压缩中间输出,以及使用哪些压缩编解码器。

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/Mapper.html

柳昊焱
2023-03-14

我相信它们存储在临时位置,开发人员无法使用,除非您创建自己的实现 OutputCollector 的类。

我曾经不得不访问这些文件,并通过创建副作用文件来解决这个问题:http://Hadoop . Apache . org/common/docs/r 0 . 20 . 2/map red _ tutorial . html # Task副作用文件

左丘凡
2023-03-14

映射函数的输出存储在临时中间文件中。Hadoop透明地处理这些文件,因此在正常情况下,程序员无法访问这些文件。如果您对每个映射器内部发生的情况感到好奇,可以查看相应作业的日志,在其中可以找到每个映射任务的日志文件。

如果你想控制临时文件的生成位置,并有权访问它们,你必须创建自己的 OutputCollector 类,我不知道这有多容易。

如果你想看看源代码,你可以使用svn来获取它。我认为它可以在这里找到:http://hadoop.apache.org/common/version_control.html。

 类似资料:
  • 问题内容: 我正在阅读Python文档(http://docs.python.org/reference/simple_stmts.html#assignment- statements )中的赋值语句。 在其中引用: 如果目标是用括号或方括号括起来的目标列表:该对象必须是可迭代的,并且具有与目标列表中存在目标的项目数量相同的项目,并且其项目从左到右分配给相应的项目。目标。 阅读之后,我想到了编写

  • 问题内容: 我有两个LocalDate,它们代表某个时间间隔。现在,我必须获取此间隔包含的所有星期五的LocalDates。最简单的方法吗? 问题答案: 解决方案:懒惰地走一个星期。 测试

  • 问题内容: 当我在Jenkins工作流程(Jenkins 1.609.1,工作流程1.8)上运行以下代码时,出现“ NotSerializableException”错误(同样在下面)。但是,如果我将“构建作业”移到“ for”范围之外,则可以正常工作(该作业已激活)。任何想法为什么这种行为? 得到错误: 问题答案: 我thnk这是因为它试图序列化不可序列化的迭代器只要它击中了一步。有关使用不可序

  • 使用Spring 我的服务: 后来我实现了一些逻辑: 但它没有捕获关于重复密钥的报告的异常: 所以,我的角色并没有被扔出去。我的角色已经不存在了。在服务结束方法的事务提交期间引发异常。如何捕捉异常???或者如何以另一种方式在Spring中实现这种逻辑??

  • 我有三个工作表,我想根据特定条件在它们之间传输数据行。根据文本字符串从sheet1到sheet2,以及根据今天的日期与输入日期之间的差异从sheet2到sheet3。然而,到目前为止,我的尝试都是徒劳的。 我想根据列“P”读取为“Completed”还是“抛出”,将数据从sheet1移动到sheet2。我还想在“O”列中记录更改为上述任一选项的日期。 对于第二种情况,我想根据列“O”中列出的日期是

  • 问题内容: 这是我正在尝试执行的一些代码片段: 我似乎无法比较日期和日期时间值。比较这些的最佳方法是什么?我应该将日期时间转换为日期还是相反?我如何在它们之间转换。 (一个小问题,但似乎有点令人困惑。) 问题答案: 使用该方法将日期时间转换为日期: 或者,您可以使用代替。你可以用 消除之后的时间部分。