我怎样才能包含Hadoopstream作业的Python包?

我想包括一个Python包(NLTK)与Hadoopstream作业,但不知道如何做到这一点,而不包括手动通过CLI参数,“文件”的每个文件。

编辑:一个解决scheme是将这个软件包安装在所有的奴隶,但我没有目前的select。

我会将这个包压缩成一个.tar.gz或者一个.zip然后把整个压缩文件或者压缩文件传递给你的hadoop命令。 我以前用Perl做过,但不是Python。

也就是说,如果你在http://docs.python.org/library/zipimport.html使用Python的;zipimport ,那么你可以直接从zip中导入模块。

刚刚遇到这个解决scheme的gem: http : //blog.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/

首先创buildzip文件夹所需的库

 zip -r nltkandyaml.zip nltk yaml mv ntlkandyaml.zip /path/to/where/your/mapper/will/be/nltkandyaml.mod 

接下来,通过Hadoopstream包含“-file”参数:

 hadoop -file nltkandyaml.zip 

最后,通过python加载库:

 import zipimport importer = zipimport.zipimporter('nltkandyaml.mod') yaml = importer.load_module('yaml') nltk = importer.load_module('nltk') 

此外,本页面总结了如何包含语料库: http : //www.xcombinator.com/2009/11/18/how-to-use-cascading-with-hadoop-streaming/

下载并解压wordnet语料库

 cd wordnet zip -r ../wordnet-flat.zip * 

在python中:

 wn = WordNetCorpusReader(nltk.data.find('lib/wordnet-flat.zip')) 

你可以像这样使用zip库:

 import sys sys.path.insert(0, 'nltkandyaml.mod') import ntlk import yaml 

加载外部python包nltk的一个例子
参考答案
像hadoop streaming一样运行extnal python lib(NLTK)
我遵循以下方法,并成功地运行hadoopstream式传输nltk包。

假设,你已经有了你的包或者你的系统中的(nltk)

第一:

 zip -r nltk.zip nltk mv ntlk.zip /place/it/anywhere/you/like/nltk.mod 

为什么在哪里工作?
Ans: – 因为我们将通过命令行提供这个.mod压缩文件的path,所以我们不需要太担心。

第二:
您的映射器或.py文件中的更改

 #Hadoop cannot unzip files by default thus you need to unzip it import zipimport importer = zipimport.zipimporter('nltk.mod') nltk = importer.load_module('nltk') #now import what ever you like from nltk from nltk import tree from nltk import load_parser from nltk.corpus import stopwords nltk.data.path += ["."] 

第三:运行map-reduce的命令行参数

 hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \ -file /your/path/to/mapper/mapper.py \ -mapper '/usr/local/bin/python3.4 mapper.py' \ -file /your/path/to/reducer/reducer.py \ -reducer '/usr/local/bin/python3.4 reducer.py' \ -file /your/path/to/nltkzippedmodfile/nltk.mod \ -input /your/path/to/HDFS/input/check.txt -output /your/path/to/HDFS/output/ 

因此,上面的步骤解决了我的问题,我认为它也应该解决其他问题。
干杯,