从Hadoop mapreduce作业打开HDFS上的文件

时间:2013-08-27 20:09:33

标签: python hadoop hadoop-streaming

通常,我可以使用以下内容打开一个新文件:

aDict = {}
with open('WordLists/positive_words.txt', 'r') as f:
    aDict['positive'] = {line.strip() for line in f}

with open('WordLists/negative_words.txt', 'r') as f:
    aDict['negative'] = {line.strip() for line in f}

这将打开WordLists文件夹中的两个相关文本文件,并将每行添加到字典中为正面或负面。

但是,当我想在Hadoop中运行mapreduce作业时,我认为这不起作用。我正在运行我的程序:

./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -file hadoop_map.py -mapper hadoop_reduce.py -input /toBeProcessed -output /Completed

我试图将代码更改为:

with open('/mapreduce/WordLists/negative_words.txt', 'r')

其中mapreduce是HDFS上的文件夹,WordLists是包含否定词的子文件夹。但我的程序没有找到这个。我正在做什么,如果是这样,在HDFS上加载文件的正确方法是什么。

修改

我现在尝试过:

with open('hdfs://localhost:9000/mapreduce/WordLists/negative_words.txt', 'r')

这似乎有所作为,但现在我得到了这种输出:

13/08/27 21:18:50 INFO streaming.StreamJob:  map 0%  reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob:  map 50%  reduce 0%
13/08/27 21:18:50 INFO streaming.StreamJob:  map 0%  reduce 0%

然后一份工作失败了。所以还是不对。有什么想法吗?

编辑2:

重新阅读API后,我注意到我可以使用终端中的-files选项指定文件。 API声明:

  

-files选项在当前工作目录中创建符号链接   指向文件本地副本的任务。

     

在此示例中,Hadoop会自动创建一个名为的符号链接   testfile.txt在任务的当前工作目录中。这个   符号链接指向testfile.txt的本地副本。

-files hdfs://host:fs_port/user/testfile.txt

因此,我跑:

./hadoop/bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.reduce.tasks=0 -files hdfs://localhost:54310/mapreduce/SentimentWordLists/positive_words.txt#positive_words -files hdfs://localhost:54310/mapreduce/SentimentWordLists/negative_words.txt#negative_words -file hadoop_map.py -mapper hadoop_map.py -input /toBeProcessed -output /Completed

根据我对API的理解,这会创建符号链接,因此我可以在代码中使用“positive_words”和“negative_words”,如下所示:

with open('negative_words.txt', 'r')

但是,此仍然不起作用。任何人都可以提供的帮助将非常感激,因为在我解决这个问题之前我做不了多少。

编辑3:

我可以使用这个命令:

-file ~/Twitter/SentimentWordLists/positive_words.txt

以及我的其余命令来运行Hadoop作业。这会在我的本地系统而不是HDFS上找到该文件。这个不会抛出任何错误,所以它被接受为某个文件。但是,我不知道如何访问文件。

2 个答案:

答案 0 :(得分:2)

经过充分评论后的解决方案:)

在python中读取数据文件:使用-file发送它并将以下内容添加到脚本中:

import sys

有时需要在import之后添加:

sys.path.append('.')

(与Hadoop Streaming - Unable to find file error中的@DrDee评论相关)

答案 1 :(得分:0)

以编程方式处理HDFS时,您应该查看FileSystem,FileStatus和Path。这些是hadoop API类,允许您在程序中访问HDFS。