用Hadoop-mapreduce实现并行约简

用Hadoop-mapreduce实现并行约简,hadoop,mapreduce,Hadoop,Mapreduce,我正在使用Hadoop的MapReduce。我有一个文件作为map函数的输入,map函数做了一些事情(与问题无关)。我希望我的减速机获取地图的输出并写入两个不同的文件。 在我看来(我想要一个有效的解决方案),我有两种想法: 1个减速机,可以识别不同的情况并写入2个不同的上下文 2个并行减缩器,每个减缩器都知道如何识别其相关输入,忽略另一个减缩器的输入,这样每个减缩器将写入一个文件(每个减缩器将写入不同的文件) 我更喜欢第一个解决方案,因为这意味着我将只检查map的输出一次,而不是两次并行-但是如

我正在使用Hadoop的MapReduce。我有一个文件作为map函数的输入,map函数做了一些事情(与问题无关)。我希望我的减速机获取地图的输出并写入两个不同的文件。 在我看来(我想要一个有效的解决方案),我有两种想法:

  • 1个减速机,可以识别不同的情况并写入2个不同的上下文
  • 2个并行减缩器,每个减缩器都知道如何识别其相关输入,忽略另一个减缩器的输入,这样每个减缩器将写入一个文件(每个减缩器将写入不同的文件)
  • 我更喜欢第一个解决方案,因为这意味着我将只检查map的输出一次,而不是两次并行-但是如果第一个在某种程度上不受支持-我将很高兴听到第二个建议的解决方案


    *注意:这两个最终文件应该分开,此时无需加入它们。

    Hadoop API具有创建多个调用的输出的功能,这使首选解决方案成为可能。

    Hadoop API具有创建多个调用的输出的功能,这使首选解决方案成为可能。

    如果您知道在映射阶段记录必须转到哪个文件,您可以使用指定地图输出应转到哪个文件的特殊键标记地图输出。例如,如果记录R1必须转到文件1,则输出。。(1是键..文件1的符号表示,R1是值)如果记录R2必须转到文件2,则映射输出将为

    然后,如果将映射缩减作业配置为仅使用2个缩减器。。它将保证标记为的所有记录将发送到1个减速机,并发送到另一个减速机


    这将比您首选的解决方案更好,因为您仍然只需要检查一次地图输出。。同时,它将是并行的。

    如果您在映射阶段知道记录必须转到哪个文件,您可以使用特殊键标记映射输出,指定它应该转到哪个文件。例如,如果记录R1必须转到文件1,则输出。。(1是键..文件1的符号表示,R1是值)如果记录R2必须转到文件2,则映射输出将为

    然后,如果将映射缩减作业配置为仅使用2个缩减器。。它将保证标记为的所有记录将发送到1个减速机,并发送到另一个减速机


    这将比您首选的解决方案更好,因为您仍然只需要检查一次地图输出。。同时,它也将是并行的。

    你是否考虑过从映射器中发出两个单独的键,每个映射器输出都有一个键?如果没有选择进入这两个文件中的每一个的标准,那么你可以简单地有两个减法器并发出键/值对。一个reducer中的所有键/值将进入一个文件,其余的将进入另一个文件。我们需要关于如何识别每种类型记录的更多信息(正如@David所说的-如果您可以在映射器中为每种类型的记录创建不同的键,那么您可以在该键上使用hadoop分区,并将每一条记录发送到其特定的reducer)MaT:我确实有一个标准,它是在地图阶段设置的,你是否考虑从映射器中发出两个单独的键,每个映射器输出一个键?如果没有选择进入这两个文件中的每一个的标准,那么你可以简单地有两个减法器并发出键/值对。一个reducer中的所有键/值将进入一个文件,其余的将进入另一个文件。我们需要关于如何识别每种类型记录的更多信息(正如@David所说的-如果您可以在映射器中为每种类型的记录创建不同的键,那么您可以在该键上使用hadoop分区,并将每一条记录发送到其特定的reducer)@Matt:我有一个标准,是在地图阶段设定的