Hadoop Streaming:在EMR上导入模块

4 投票
1 回答
2293 浏览
提问于 2025-04-17 06:19

之前有个问题讨论了如何在Hadoop流处理工作中导入像nltk这样的模块。

这里面提到的步骤是:

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

现在你可以在你的Python脚本中导入nltk模块了: import zipimport

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

我有一个工作想在亚马逊的EMR上运行,但我不太确定该把压缩文件放在哪里。我需要在启动选项下创建一个引导脚本,还是应该把tar.gz文件放在S3上,然后在额外参数中引用它?我对这些都很陌生,如果能有个详细的步骤指导我一下,我会非常感激。

1 个回答

2

你有以下几种选择:

  1. 创建一个启动脚本,并把它放到S3上。这个脚本会下载你需要的模块,并把它放在你的mapper/reducer可以访问的地方。要找出具体应该把文件放在哪里,可以启动集群并保持它在完成后不关闭,然后通过ssh连接到集群,查看目录结构。

  2. 使用mrjob来启动你的作业流。在用mrjob启动作业时,可以指定bootstrap_python_packages,mrjob会自动安装这些包,它的方式是解压缩.tar.gz文件并运行setup.py install

http://packages.python.org/mrjob/configs-runners.html

我更倾向于选择第二种,因为mrjob在用Python开发MapReduce作业时非常有帮助。特别是它可以让你在本地(无论是否使用Hadoop)以及在EMR上运行作业,这样可以简化调试过程。

撰写回答