【问题标题】:Hadoop Reducer not combining all map jobsHadoop Reducer 未结合所有地图作业
【发布时间】:2013-09-03 23:51:19
【问题描述】:

链接:https://stackoverflow.com/questions/18583242/funny-results-with-hadoop-will-having-a-single-input-file-cause-this

我发布了这个关于 Hadoop 的问题,但现在我的问题缩小了一点,所以我提出了一个更具体的问题。

我创建了一个 Hadoop Map/Reduce 作业。它需要一个 CSV 并将其读入 defaultdict,导入两个文件(正面和负面词),然后对 csv 中的所有文本进行情绪分析。然后它输出这个结果(由 reducer 收集)并组合所有键。

我可以像这样在本地运行它:

cat ~/Text/ListOfTexts.csv | python hadoop_map.py | sort | python hadoop_reduce.py 

这会产生预期的结果而不会出现任何问题。然后我尝试像这样使用 Hadoop Streaming 运行它:

bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar 
-file positive_words.txt -file negative_words.txt 
-file hadoop_map.py -mapper hadoop_map.py 
-file hadoop_reduce.py -reducer hadoop_reduce.py 
-input /ListOfTexts.csv -output /OutputOfTexts.txt

这会处理所有信息,但由于某种原因无法正确组合结果。我实现了一个“计数”变量来查看它正在扫描多少个文档(应该有 1199 个)。如果我运行 just 映射器,我会得到两个输出文件,一个是 630,另一个是 569(因此加起来是 1199)。

但是,当我使用与本地使用的代码相同的减速器时,我只计算了 630。此外,并非所有对都已合并。这让我觉得 Hadoop 没有正确组合结果。有人知道为什么会这样吗?如有必要,我可以发布我的代码,但我会尽量减少这里的字数。

【问题讨论】:

    标签: python csv hadoop mapreduce


    【解决方案1】:

    我最终通过廉价的 hack 解决了这个问题

    在reducer 开始工作之前,映射器没有对结果进行排序。我有这样的方法:

    if currentKey == key:
        do something
    

    问题在于,这将对一些相同的键执行,而其他键直到稍后才读入,因此它们的处理取代了之前在此语句中所做的处理。

    为了解决这个问题,reducer 的每一行输入都被读取到一个新的默认字典中,以确保所有相同的键都在一起。

    这就是我在本地机器上进行测试的原因。因为我这样做了:

    cat name_of_file.csv | python hadoop_map.py | sort | python hadoop_reducer.py
    

    Hadoop 没有在中间进行排序。

    我仍然不确定为什么这不是由 Hadoop 自动完成的,正如我所说,我的解决方案是一种廉价的 hack。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2013-09-05
      • 2012-08-18
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多