我正在尝试针对特定问题实现MapReduce算法。假设在我的Mapper中,我需要处理一个大型文本对象。下面的示例总结了我的问题。我有文本对象:Today is a lovely day,我需要对单词进行一些处理。所以我有两个选择:

  • 我可以发送以下形式的Reducer键值对:
    <1,Today>
    
    <1,is>
    
    <1,a>
    
    <1,lovely>
    
    <1,day>
    
  • 我可以将键值对<1,Today is a lovely day>发送到reducer,然后对其进行处理,例如标记化String对象。

  • 在这种情况下最好的方法是什么?在第一种情况下,我必须将更多数据发送到reducer,但是没有第二种情况下的String对象要标记化。但是,在第二种情况下,映射器发送的数据量较小。

    最佳答案

    我认为您不会通过减少流量来大幅提高性能。真正重要的是,在第一种情况下,您的所有数据都将按单词进行分组,然后再通过单词输入到简化器,从而与第二个选项相比,将得到一组完全不同的键值对。我不确定您是否可以对它们执行相同的操作。假设您将拥有:

    <Today is a lovely day>
    <Today is another lovely day>
    

    在第一种情况下,reduce可以对成对的单词进行组合(假设键是单词而不是数字):
    <a, 1>
    
    <another, 1>
    
    <day, 2>
    
    <is, 2>
    
    <lovely,2>
    
    <Today, 2>
    

    如您所见,reducer输入是分组和排序的,在更高级的场景中,您将根据此类输入的值执行逻辑,例如查找最大值或搜索平均值。

    在第二种情况下,您的键将是句子:
    <Today is a lovely day, 1>
    
    <Today is another lovely day, 1>
    

    因此,有两个不同的异径管将处理这两个对的机会。您可以对其执行的操作与第一个操作稍有不同,因为它将是一组不同的数据。就像第一种情况一样,您将无法执行基于键的最大值或平均值

    关于java - Hadoop上的MapReduce-将数据从Mapper发送到Reducer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43054835/

    10-16 02:48