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