Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mapper&;中的不同键;组合器_Java_Hadoop - Fatal编程技术网

Java Mapper&;中的不同键;组合器

Java Mapper&;中的不同键;组合器,java,hadoop,Java,Hadoop,在Map Reduce中,可以在映射器、组合器和还原器之间传播不同类型的键 例如,如果我有一个映射器(用Java实现),它输出文本,可作为键/值对写入。 然后,在combiner中,我将所有输出合并为单个键,并希望将其输出为可空写的文本。 然后在Reducer中,我想输出文本,intwriteable 有可能像上面那样做吗?若否,原因为何 您可以使用以下方法为mapper和reducer指定不同的键/值类型: job.setMapOutputKeyClass(Text.class); job.s

在Map Reduce中,可以在映射器、组合器和还原器之间传播不同类型的键

例如,如果我有一个映射器(用Java实现),它输出文本,可作为键/值对写入。 然后,在combiner中,我将所有输出合并为单个键,并希望将其输出为可空写的文本。 然后在Reducer中,我想输出文本,intwriteable


有可能像上面那样做吗?若否,原因为何

您可以使用以下方法为mapper和reducer指定不同的键/值类型:

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);


但不能为组合器设置不同于映射器的键/值类型。这是因为组合器仅用于减少从映射器发送到reducer的数据量。您应该能够在没有任何副作用的情况下移除组合器。但是,如果组合器生成
NullWritable,Text
对,而映射器生成
Text,IntWritable
对,则没有组合器,程序将失败。

您可以使用Text而不是IntWritable:

  • 映射器输出:文本,文本
  • 组合器:文本,文本。可以使用组合器输出键nullwriteable
  • 减速机输入:文本,文本

Hadoop确实使用组合器优化处理,但不能保证组合器的执行。因此,您不能假设,Hadoop可以将映射输出数据直接发送到Reducer阶段


关于这一点的讨论,我建议阅读的第3章。在PDF文件的第48页中,对该问题进行了评论。

基本上,你是说所有映射器、组合器和还原器都应该具有相同的输入/输出键/值类型吗?否=)我只是试图解释为什么映射器和组合器的不同输出键/值类型没有意义。您的程序不应取决于合路器是否启用。合并器仅用于减少将从映射器传输到还原器的数据量,它们不应包含任何其他逻辑,因此您应该能够删除合并器而不会产生任何副作用。
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);