Hadoop和Python:查看错误

Hadoop和Python:查看错误,python,logging,hadoop,mapreduce,cluster-computing,Python,Logging,Hadoop,Mapreduce,Cluster Computing,我正在使用Hadoop流来运行一些Python代码。我注意到,如果我的Python代码中有错误(例如在mapper.py中),我将不会收到关于错误的通知。相反,映射程序将无法运行,几秒钟后作业将被终止。查看日志时,我看到的唯一错误是mapper.py无法运行或找不到,情况显然并非如此 我的问题是,我是否可以检查特定的日志文件,以查看mapper.py代码中可能存在的实际错误?(例如,如果导入命令失败,将告诉我) 谢谢大家! 编辑:使用的命令: bin/hadoop jar contrib/str

我正在使用Hadoop流来运行一些Python代码。我注意到,如果我的Python代码中有错误(例如在mapper.py中),我将不会收到关于错误的通知。相反,映射程序将无法运行,几秒钟后作业将被终止。查看日志时,我看到的唯一错误是mapper.py无法运行或找不到,情况显然并非如此

我的问题是,我是否可以检查特定的日志文件,以查看mapper.py代码中可能存在的实际错误?(例如,如果导入命令失败,将告诉我)

谢谢大家!

编辑:使用的命令:

bin/hadoop jar contrib/streaming/hadoop-streaming.jar \ -file /hadoop/mapper.py -mapper /hadoop/mapper.py -file /hadoop/reducer.py -reducer /hadoop/reducer.py -input /hadoop/input.txt -output /hadoop/output
以及我所引用的文章,我希望看到其中的错误: 评论后编辑:

假设您在一个完全分布式的Hadoop环境中,并且知道如何在一个节点中为python配置NLTK,那么您需要在集群的所有节点中提供NLTK包,以便从NLTK.corpus导入python
,并使用命令
stopwords.words('english')

在我看来,NLTK需要在集群的所有节点中手动配置,以使mapper.py python脚本实际工作


如果这些没有帮助,例如专门讨论NLTK,如果向下滚动。

关于日志问题,请参阅此帮助:


我假设,如果python文件无法运行,那么解释器应该打印到stdout,您可以在该节点的stdout日志中看到它。

这不是一个真正的解决方案,但我发现使用一小部分数据在本地测试映射器和减缩器很有用。例如
cat testData |./mapper.py |./reducer.py
@vinaut感谢您的回复。实际上我已经这样做了,但是我遇到了一个可以在本地工作的脚本,但在通过Hadoop运行时就不行了。测试数据是什么样的,每一行都是完整的记录吗?@vinaut是的。输入文件由几行组成,每行只有一个数字。这是非常基本的,我只是想理解基本的概念。不过,我遇到的问题很奇怪。如果您感兴趣,我刚刚在这里发布了相关信息:那么,映射器只是按原样打印输入,一次打印一行?谢谢您的回复。我已经试过了,不幸的是,我遇到了同样的问题。当注释掉行
print stopwords.words('english')
时,映射器工作正常。事实上,它甚至可以毫无错误地导入stopwords库。但是,似乎是该行的取消注释导致作业在0%map,0%reduce停止。您是否再次收到“无此类文件或目录”错误消息,以及我的建议?快速问题,为什么要打印停止字?抱歉,延迟。是的,很遗憾,我在您的方法中收到了相同的错误消息。我的完整程序实际上不会打印停止字。正如您所说,我将使用它们进行过滤。现在我已经简化了,只需打印它们,这样我就可以确保程序可以无误地访问这些单词。另一个问题,“英语”是
print stopwords中的一个文件。单词(“英语”)
?如果是,您也需要使用
-file
来跨节点发送。谢谢您的回复。当我检查该日志时,我看到以下消息:
java.io.IOException:cannotrunprogram“mapper.py”:error=2,没有这样的文件或目录
。但我对此感到困惑,因为当
打印stopwords时,程序显然正在运行。单词('english')
被注释掉。所以您打印到stdout的是一个单词列表,然后是一堆只包含数字的行?我不知道hadoop是否会理解这一点,映射程序应该以默认格式一行接一行地打印一致的数据:
key/t value
。我承认这并不能解释您所遇到的错误,但请尝试在单词列表上循环,并为每个单词打印单词“\t 1”
,而不是其他任何内容。很抱歉延迟回复。不过,我认为它应该在
for
循环之前理解print命令。当我键入
print“hello”
而不是
print stopwords.words('english')
时,效果很好。出于某种原因,即使
从nltk.corpus导入stopwords
成功运行,
打印stopwords.words('english')
也会导致错误。我不太确定。无论您打印什么,它都应该将其解释为要处理的有效数据。如果您只打印一个像hello这样的单词(它会将其解释为一个带有空值的键“hello”),那么这可能是可以的,但如果您打印一个完整的列表,则不可以。不过这只是一个假设。但我相当肯定,一般来说,除非在某个地方进行了配置,否则映射器和还原器应该只打印一致的数据。当您使用流式Hadoop时,它是“哑”的,它假定正在以预期的形式向它提供数据。如果您需要打印不适用于mapper的其他内容,请将其保存在一个文件中。我刚刚测试了它,它确实也适用于测试列表,因此我认为它也应该适用于这里。然而,由于一些奇怪的原因,测试列表打印了两次,如下所述: