【问题标题】:MapReduce on Hadoop - sending data from the Mapper to the ReducerHadoop 上的 MapReduce - 将数据从 Mapper 发送到 Reducer
【发布时间】:2017-03-28 04:15:04
【问题描述】:

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

  • 我可以发送到Reducer 键值对的形式:

    <1,Today>
    
    <1,is>
    
    <1,a> 
    
    <1,lovely> 
    
    <1,day>
    
  • 我可以将键值对&lt;1,Today is a lovely day&gt; 发送到reducer,然后对其进行处理,例如标记字符串对象。

这种情况的最佳方法是什么?在第一种情况下,我必须向减速器发送更多数据,但我没有字符串对象来标记,就像在第二种情况下一样。但是在第二种情况下,我的 Mapper 发送的数据量较少。

【问题讨论】:

    标签: java hadoop


    【解决方案1】:

    我认为通过这种方式减少流量不会显着提高性能。这里真正重要的是,在第一种情况下,您的所有数据将在按字输入到 reducer 之前进行分组,从而与第二个选项相比,产生一组完全不同的键值对。我不确定您是否能够对它们执行相同的操作。假设您将拥有:

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

    在第一种情况下,您的减速器将使用成组的单词对进行操作(假设键是单词而不是数字):

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

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

    【讨论】:

    • 感谢您的洞察力(赞成)。所以,基本上你是说在第二种情况下我发送的数据更少(如果),但是当我应用第二种选择时,在操作方面有更多的好处。对吗?
    • @thanasissdr 我不能说你会从其中任何一个中获得或多或少的好处,我想说这两种情况针对不同的用例。在第二个选项中,你不能做你可以在第一个和相反的地方做的事情。在第二种情况下,您将发送更少的数据。但这不会像您想象的那样影响最终性能。您的大部分时间将花在 mapper 和 reducer 执行的计算上。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多