Hadoop 在map reduce程序的reducer函数中比较来自同一文件的数据

Hadoop 在map reduce程序的reducer函数中比较来自同一文件的数据,hadoop,mapreduce,Hadoop,Mapreduce,在我的map reduce程序中,mapper函数将提供两个键值对: 1) (1人,年龄) 2) (2人,年龄) (为了简单起见,我保留了2对,如果你能解释n条线就好了) 现在我想写一个减速机,它将比较两者的年龄,并给出谁更老的答案 我无法理解的是mapper的输出将在文件中的不同行中。当reducer在文件上逐行运行时,它将如何比较它们。 提前感谢。在reducer方法中,您将得到的只是一个键和值列表。因此,您可以在该键的值列表中找到最小值或最大值。但是,如果需要与其他键进行比较,然后,您可能

在我的map reduce程序中,mapper函数将提供两个键值对:

1) (1人,年龄)

2) (2人,年龄)

(为了简单起见,我保留了2对,如果你能解释n条线就好了)

现在我想写一个减速机,它将比较两者的年龄,并给出谁更老的答案

我无法理解的是mapper的输出将在文件中的不同行中。当reducer在文件上逐行运行时,它将如何比较它们。
提前感谢。

在reducer方法中,您将得到的只是一个键和值列表。因此,您可以在该键的值列表中找到最小值或最大值。但是,如果需要与其他键进行比较,然后,您可能应该考虑一个单一的reducer,从映射器中获取所有记录,并在reducer类中使用参考变量(而不是局部变量)处理该逻辑,并使用每个键的每个最小/最大值更新参考变量,查看以下逻辑是否符合您的目的:

A

  • 从地图中发射(年龄、人名)

  • 只有1个减速器- 您将以排序方式获得所有年龄、人员配对。所以,简单地说,第一个是最年轻的,最后一个是最老的

    如果不想打印所有值,只需在reducer任务中有两个引用—最年轻的引用和最老的引用—在reduce方法中设置它们,并在reducer任务的清理中发出所需的引用

  • B

  • 如你所说,有一个映射器(姓名、年龄)
  • 在任务中:

    a。使用setup()创建树映射

    b。在reduce()中,在树状图中添加(年龄、人)

    c。您的地图将按年龄排序,您可以在cleanup()中使用它来做一些事情


  • 基本上,您可以将所有键、值存储在reduce()中的内部对象中,在cleanup()中,您可以访问所有这些值,并在其中执行任何逻辑。

    我认为您的用例直接适用于二次排序技术

    二次排序是一种技术,用于对映射器发出的“值”进行排序。主要排序将由映射器发出的“键”完成

    如果您试图在reducer级别对所有值进行排序,可能会导致内存不足。二级排序应在映射器级别进行

    看看这个

    在上述示例中,只需将“年”替换为“人”,将“温度”替换为“年龄”

    解决方案:

  • 创建自定义分区器,将特定键的所有值发送到单个减速机

  • 排序应该由Key完成,mapper=>Create发出的值组合使用Key+Value组合键进行排序。提出一个比较器,首先按键进行排序,然后按值进行排序


  • 你们是对的,若我必须比较同一个键的值,这很容易,但在我的例子中,我想比较具有不同键的值。正如u所说,我可以使用引用变量,但问题是在得到所有值之前,我不能对所有值进行排序。那么,我怎么知道这是在没有数据之后对reducer的最后一次调用呢?当您说您只需要一个reducer时,所有映射程序中的所有数据都将可用,您可以执行比较。将reducer任务的数量设置为1,这应该会很小心。只有一个reducer,但映射程序将提供具有不同键的n条记录。现在,如果我想比较与键1关联的值和与键2关联的值,那么这是怎么可能的。实际上,这也是可能的,但是为了对所有这n条记录进行排序,我如何知道映射器给出的最后一条记录是哪一条(这里的一条记录是指映射器转发的一对记录)一旦所有映射器都完成了,因为您只有一个reducer,那么将为每个键调用reducer方法。所以调用reducer方法的时间等于键的数量。因此,您可以检查该键的所有值并获取最小值,并保留实例变量的引用,并在调用reducer方法时进行更新。对于最小值和最大值,一个引用变量就足够了。但是如果我需要对具有不同键的值进行排序,那就太好了!!!!我正在寻找函数setup()和cleanup(),正如你提到的。谢谢每个任务调用一次清理方法(对于mapper或reducer)。所以对于减速机,这仍然是在每个键i上suppose@Ramzy,reducer任务按顺序包含以下方法:1。安装程序()2。对于每个键,值reduce()为3。cleanup()所以reduce()将只有一个键及其值,但您不必发出它们,只需将它们存储在内部数据结构(hashmap,list)中即可。在cleanup()中,所有键和值都存储在内部对象中,您可以在其中执行逻辑。好的,假设这是选项B,则reducer任务将处理部分键,除非它是单个reducer。那么,我们是否可以继续进行此操作,以比较所有映射器输出中的所有键?@Ramzy,仍然需要单个reducer才能在cleanup()中包含所有数据。同样正如Ravindra提到的,这些都不是非常大数据的有效解决方案,因为减速机内存可能是瓶颈。我只是想指出,我们如何才能摆脱只知道一个键的限制,即recue()中的values climation。这种方法在映射器处理大量数据,但reducer输入不是很大(所以单个reducer是可以的)的情况下非常有用。