如何在Amazon弹性MapReduce(EMR)中导入本地Python包?

如何在Amazon弹性MapReduce(EMR)中导入本地Python包?,python,amazon-web-services,hadoop-streaming,elastic-map-reduce,Python,Amazon Web Services,Hadoop Streaming,Elastic Map Reduce,我有两个打算在Amazon Elastic MapReduce上运行的Python脚本——一个作为映射器,另一个作为还原器。我最近刚刚扩展了mapper脚本,需要更多的本地模型,我已经创建了这些模型,它们都在一个名为感伤分析的包中。从S3上的本地Python包导入Python脚本的正确方法是什么?我试图创建模拟我的文件系统的S3密钥,希望相关路径能够工作,但可惜没有。以下是步骤失败后,我在S3上的日志文件中看到的内容: Traceback (most recent call last): Fil

我有两个打算在Amazon Elastic MapReduce上运行的Python脚本——一个作为映射器,另一个作为还原器。我最近刚刚扩展了mapper脚本,需要更多的本地模型,我已经创建了这些模型,它们都在一个名为感伤分析的包中。从S3上的本地Python包导入Python脚本的正确方法是什么?我试图创建模拟我的文件系统的S3密钥,希望相关路径能够工作,但可惜没有。以下是步骤失败后,我在S3上的日志文件中看到的内容:

Traceback (most recent call last):
File "/mnt/var/lib/hadoop/mapred/taskTracker/hadoop/jobcache/job_201407250000_0001/attempt_201407250000_0001_m_000000_0/work/./sa_mapper.py", line 15, in <module>
from SentimentAnalysis import NB, LR
ImportError: No module named SentimentAnalysis
并且mapper.py具有:

from SentimentAnalysis import NB, LR
我试图在S3中镜像文件结构,但似乎不起作用

设置S3或EMR以便sau mapper.py可以导入NB.py和LR.py的最佳方法是什么?做这件事有什么特别的窍门吗?

你有什么特别的窍门吗

__init__.py

在分析文件夹中?

您正在运行的命令是什么? 唯一的方法是,当您想要运行步骤时,您可以为该步骤添加额外的字段,例如:如果您正在使用boto包在emr上运行任务,那么您有一个类:StreamingStep

其中包含参数:如果使用版本2.43 cache_files liststr–要与作业绑定的缓存文件列表 cache_archives liststr–要与作业绑定的jar归档的列表

这意味着您需要将要从s3获取的文件夹的文件路径传递到集群中。 语法是: s3://{s3 bucket path}/EMR\u Config.pyEMR\u Config.py 其中hashtag是您使用的分隔符,前面的部分是s3中的位置,后面的部分是您希望它具有的名称和位置,当前它将位于与您正在运行的任务相同的位置

如果集群中有它们,则不能简单地进行导入, 有效的方法是:

# we added a file named EMR_Config.py, 
sys.path.append(".")

#loading the module this way because of the EMR file system
module_name = 'EMR_Config'
__import__(module_name)
Config = sys.modules[module_name]

#now you can access the methods in the file, for example:
topic_name = Config.clean_key(row.get("Topic"))
是的,我在感伤分析文件夹中有init.py。
# we added a file named EMR_Config.py, 
sys.path.append(".")

#loading the module this way because of the EMR file system
module_name = 'EMR_Config'
__import__(module_name)
Config = sys.modules[module_name]

#now you can access the methods in the file, for example:
topic_name = Config.clean_key(row.get("Topic"))