如何在Hadoop流媒体作业中包含python包?

时间:2011-07-25 03:33:59

标签: python hadoop

我正在尝试使用带有Hadoop流式传输作业的python包(NLTK),但不知道如何在不通过CLI参数“-file”手动包含每个文件的情况下执行此操作。

编辑:一种解决方案是在所有从站上安装此软件包,但我目前没有该选项。

5 个答案:

答案 0 :(得分:27)

刚刚遇到了这个解决方案的宝石: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/

下载并解压缩wordnet语料库

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

在python中:

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

答案 1 :(得分:7)

我会将软件包压缩为.tar.gz.zip并将整个tarball或归档文件以-file选项传递给hadoop命令。我过去用Perl做过这个,但不是Python。

那就是说,如果你在http://docs.python.org/library/zipimport.html使用Python的zipimport,我认为这仍然适合你,这允许你直接从zip导入模块。

答案 2 :(得分:5)

您可以像这样使用zip lib:

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

答案 3 :(得分:3)

加载外部python包nltk的例子 参考答案
Running extrnal python lib like (NLTK) with hadoop streaming
我遵循了以下方法并成功运行了nltk包,并成功进行了hadoop流式传输。

假设,您的系统中已包含您的软件包或(在我的情况下为nltk)

第一

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

为什么哪个地方有效?
答: - 因为我们将通过命令行提供这个 .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/

因此,上面的步骤解决了我的问题,我认为它也应该解决其他问题 欢呼声,

答案 4 :(得分:2)

如果您使用的是更复杂的库,例如numpy,pandas,则virtualenv是更好的方法。 您可以添加-archives将环境发送到集群。

参考写作: https://henning.kropponline.de/2014/07/18/virtualenv-hadoop-streaming/

已更新

我在在线环境中在virtualenv上面尝试过,发现了一些问题。在集群中,出现了诸如“找不到平台独立的库”之类的错误。然后,我尝试使用conda创建python env,它运行良好。 / p>

如果您是中国人,可以这样看:https://blog.csdn.net/Jsin31/article/details/53495423

如果没有,我可以简要翻译一下:

  1. 通过conda创建一个环境:

    conda create -n test python=2.7.12 numpy pandas

  2. 转到conda env路径。您可以通过cmd找到它:

    conda env list

    然后,您可以打包:

    tar cf test.tar test

  3. 通过hadoop流提交作业:
hadoop jar /usr/lib/hadoop/hadoop-streaming.jar \
-archives test.tar \
-input /user/testfiles \
-output /user/result \ 
-mapper "test.tar/test/bin/python mapper.py" \
-file mapper.py \
-reducer"test.tar/test/bin/python reducer.py" \
-file reducer.py