我想包括一个Python包(NLTK)与Hadoop流作业,但我不知道如何做到这一点,而不需要通过CLI参数手动包含每个文件“-file”。如何在Hadoop流媒体作业中包含python包?
编辑:一种解决方案是将此软件包安装在所有从站上,但目前我没有该选项。
我想包括一个Python包(NLTK)与Hadoop流作业,但我不知道如何做到这一点,而不需要通过CLI参数手动包含每个文件“-file”。如何在Hadoop流媒体作业中包含python包?
编辑:一种解决方案是将此软件包安装在所有从站上,但目前我没有该选项。
我会将包压缩成.tar.gz
或.zip
,并将整个tarball或归档文件以-file
选项传递给您的hadoop命令。我以前用Perl做过,但不是Python。
也就是说,如果您使用Python的zipimport
,http://docs.python.org/library/zipimport.html,我认为这仍然适用于您,它允许您直接从zip导入模块。
跨越这种宝石的解决方案的刚来到:http://blog.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/
首先创建ZIP瓦特/库所需
zip -r nltkandyaml.zip nltk yaml
mv ntlkandyaml.zip /path/to/where/your/mapper/will/be/nltkandyaml.mod
未来通过Hadoop的数据流,包括 “-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/
下载并解压共发现胼
cd wordnet
zip -r ../wordnet-flat.zip *
在python:
wn = WordNetCorpusReader(nltk.data.find('lib/wordnet-flat.zip'))
您可以使用压缩的lib这样:
import sys
sys.path.insert(0, 'nltkandyaml.mod')
import ntlk
import yaml
NLTK
参考答案
Running extrnal python lib like (NLTK) with hadoop streaming
加载外部Python包的例子我也跟着下面的方法,并在成功的hadoop streaming跑了NLTK包。
假设,你的系统已经你的包或(在我的情况NLTK)
第一:
zip -r nltk.zip nltk
mv ntlk.zip /place/it/anywhere/you/like/nltk.mod
为什么任何地方是否行得通呢?
Ans: - 因为我们将通过命令行提供路径到这个.mod压缩文件,所以我们不需要担心太多。
秒:
您的映射器或者更改。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/
因此,上述步骤解决了我的问题,我认为它应该解决其他人。
欢呼声,
为什么你将它移动到nltk.mod?为什么不直接从nltk.zip导入? –
击败我15秒。很好的发现。 –
@射线 - 你击败了我15秒!哈哈感谢张贴 –
我试过这个解决方案与hadoop流,并提供了与文件选项nltk zip,zipimporter不断抱怨,它不是一个zip文件,对此有什么想法?我的映射程序似乎在我的本地机器上运行,它只是在hadoop streaming上导致问题 – viper