Hadoop上的MapReduce - 将数据从Mapper发送到Reducer

时间:2017-03-27 19:26:35

标签: java hadoop

我正在尝试针对特定问题实施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发送的数据量较少。

1 个答案:

答案 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>

因此,两个不同的减速器有可能处理这两对。您可以对其执行的操作与第一个操作略有不同,因为它将是一组不同的数据。你无法像第一种情况那样执行基于密钥的最大值或平均值