1

链接: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 个)。如果我运行映射器,我会得到两个输出文件,一个是 630,另一个是 569(因此加起来是 1199)。

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

4

1 回答 1

2

我最终用便宜的黑客解决了这个问题

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

if currentKey == key:
    do something

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

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

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

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

Hadoop 没有在中间进行排序。

我仍然不确定为什么Hadoop 没有自动完成这项工作,正如我所说,我的解决方案是一种廉价的黑客攻击。

于 2013-09-03T15:51:19.667 回答