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

如何将python包包含在Hadoop流作业中?,python,hadoop,Python,Hadoop,我正在尝试包含一个带有Hadoop流作业的python包(NLTK),但不知道如何在不通过CLI参数“-file”手动包含每个文件的情况下实现这一点 编辑:一个解决方案是在所有从机上安装这个包,但我目前没有这个选项。我将把包压缩到.tar.gz或.zip中,并将整个tarball或归档文件在-file选项中传递给hadoop命令。我以前用Perl做过,但不是Python 也就是说,如果您使用Python的zipimport,我认为这仍然适用于您,它允许您直接从zip导入模块。刚刚遇到了这个解决方

我正在尝试包含一个带有Hadoop流作业的python包(NLTK),但不知道如何在不通过CLI参数“-file”手动包含每个文件的情况下实现这一点


编辑:一个解决方案是在所有从机上安装这个包,但我目前没有这个选项。

我将把包压缩到
.tar.gz
.zip
中,并将整个tarball或归档文件在
-file
选项中传递给hadoop命令。我以前用Perl做过,但不是Python


也就是说,如果您使用Python的zipimport,我认为这仍然适用于您,它允许您直接从zip导入模块。

刚刚遇到了这个解决方案:

首先创建包含所需库的zip

zip -r nltkandyaml.zip nltk yaml
mv ntlkandyaml.zip /path/to/where/your/mapper/will/be/nltkandyaml.mod
接下来,通过Hadoop stream“-file”参数包括:

hadoop -file nltkandyaml.zip
最后,通过python加载库:

import zipimport
importer = zipimport.zipimporter('nltkandyaml.mod')
yaml = importer.load_module('yaml')
nltk = importer.load_module('nltk') 
此外,本页总结了如何包括语料库:

下载并解压缩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中成功运行了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/
因此,上述步骤解决了我的问题,我认为也应该解决其他问题。

干杯,

如果你正在使用更复杂的libs,比如numpy、pandas,virtualenv是一个更好的方法。 您可以添加-archives以将环境发送到集群

参考以下文字:

已更新

我在我们的在线环境中尝试了上面的virtualenv,发现了一些问题。在集群中,出现了一些错误,比如“找不到平台独立的库”。然后我尝试了conda来创建python环境,效果很好

如果你是中国人,你可以这样看:

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

  • 通过conda创建环境:

    conda create-n test python=2.7.12 numpy pandas

  • 转到conda环境路径。您可以通过cmd找到它:

    conda环境列表

    然后,您可以将其打包:

    tar cf test.tar test

  • 通过hadoop流提交作业:

  • 比我快15秒。很好的发现。我用hadoop流媒体尝试了这个解决方案,并为nltk zip提供了-file选项,zipimporter一直抱怨它不是一个zip文件,对此有什么想法吗?我的映射器似乎在我的本地机器上工作,它只是在hadoop流媒体上工作,这导致了problem@viper,可能尝试以下修复:1)重新压缩文件,但可能使用不同的zip程序或在不同的操作系统上;2) 确保您的路径是正确的——即zipimporter只是没有找到文件吗?;3) 检查群集与本地计算机上zipimporter的版本?我模模糊糊地记得曾经有过类似的错误,但不记得我做了什么来修复。@dolan我确实尝试过在本地机器上重新压缩文件。我将尝试在集群上执行此操作,然后再试一次。@Reihan_amn--我不太确定您在哪里遇到问题。有一件看起来有问题的事情是您正在加载“nltk/_init__”,而init文件/函数会自动加载到模块上。您最好发布一个新的堆栈溢出问题,并引用这个原始问题,详细描述您的代码,等等。为什么要将其移动到nltk.mod?为什么不直接从nltk.zip导入它?
    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