我正在尝试针对特定问题实施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,然后处理它,例如tokenise String对象。
此案例的最佳方法是什么?在第一种情况下,我必须向reducer发送更多数据,但我没有像第二种情况那样标记字符串对象。但是在第二种情况下,Mapper发送的数据量较少。
答案 0 :(得分:2)
我不认为您会通过减少流量来大幅改善您的表现。这里真正重要的是,在第一种情况下,所有数据将在按字输入reducer之前进行分组,从而产生与第二个选项相比完全不同的键值对集。我不确定您是否能够对它们执行相同的操作。让我们说你会:
<Today is a lovely day>
<Today is another lovely day>
在第一种情况下,您的reducer将使用分组的单词对运行(假设该键是单词而不是数字):
<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>
因此,两个不同的减速器有可能处理这两对。您可以对其执行的操作与第一个操作略有不同,因为它将是一组不同的数据。你无法像第一种情况那样执行基于密钥的最大值或平均值