如何在Hadoop流处理作业中包含Python包?

18 投票
5 回答
13957 浏览
提问于 2025-04-16 22:12

我正在尝试在一个Hadoop流处理任务中使用一个Python包(NLTK),但是我不知道怎么做才能不通过命令行参数“-file”手动一个个地包含每个文件。

补充:一个解决办法是把这个包安装在所有的从节点上,但我现在没有这个选项。

5 个回答

5

你可以这样使用zip库:

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

我刚发现了一个很棒的解决方案:http://blog.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/

首先,创建一个包含所需库的压缩文件。

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'))
7

我会把这个包压缩成一个 .tar.gz 或者 .zip 文件,然后在你的 Hadoop 命令中用 -file 选项传入整个压缩包。我以前用 Perl 做过这个,但没用过 Python。

不过,我觉得如果你使用 Python 的 zipimport,这应该还是可以的。你可以在这个链接找到相关信息:http://docs.python.org/library/zipimport.html。这个功能可以让你直接从压缩文件中导入模块。

撰写回答