我正在尝试实现一个特定问题的mapreduce算法。假设在我的Map器中,我需要处理一个大尺寸的文本对象。下面的例子总结了我的问题。我有文本对象: Today is a lovely day
我需要对单词做一些处理。所以我有两个选择:
我可以向reducer发送以下形式的键值对:
<1,Today>
<1,is>
<1,a>
<1,lovely>
<1,day>
我可以发送键值对 <1,Today is a lovely day>
然后对其进行处理,例如,标记字符串对象。
对于这种情况,最好的方法是什么?在第一种情况下,我必须向reducer发送更多的数据,但是我没有要标记的string对象,就像在第二种情况下一样。但是,在第二种情况下,Map器发送的数据量较小。
1条答案
按热度按时间tvz2xvvm1#
我不认为你会大大提高你的性能,通过减少流量的方式。这里真正重要的是,在第一种情况下,所有数据在按字进入reducer之前都将被分组,从而产生一组与第二个选项完全不同的键值对。我不确定你能不能对他们做同样的手术。假设您将拥有:
在第一种情况下,reducer将使用分组的单词对(假设关键字是单词而不是数字):
正如您所看到的,reducer输入是分组和排序的,在更高级的场景中,您可以根据这些输入的值执行逻辑,比如查找最大值或搜索平均值。
在第二种情况下,关键是句子:
所以有可能两个不同的减速器会处理这两对。您可以对它执行的操作与第一个操作略有不同,因为它是一组不同的数据。不可能像第一种情况那样执行基于键的最大值或平均值