我有两个Python脚本,它们打算在Amazon Elastic MapReduce上运行-一个作为映射器,另一个作为减速器。我最近刚刚扩展了映射器脚本,需要更多的本地模型,这两个模型都位于一个名为SentimentAnalysis的包中。从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相关文件结构如下:
sa_mapper.py
sa_reducer.py
SentimentAnalysis/NB.py
SentimentAnalysis/LR.pymapper.py有:
from SentimentAnalysis import NB, LR我尝试在S3中镜像文件结构,但似乎不起作用。
设置S3或电子病历的最佳方式是什么,以便sa_mapper.py可以导入NB.py和LR.py?做这件事有什么特别的技巧吗?
发布于 2014-07-25 10:06:14
你有没有
__init__.py在SentimentAnalysis文件夹中?
发布于 2016-11-30 17:40:09
您正在运行的命令是什么?
要做到这一点,唯一的方法是当您想要运行步骤时,您可以在该步骤中添加额外的字段,例如:如果您正在使用boto包在电子病历上运行任务,则可以使用类: StreamingStep
其中包含以下参数:(如果使用2.43版)
cache_files ( list (str)) -要与作业捆绑的缓存文件列表
cache_archives ( list (str)) -要与作业捆绑的jar归档的列表
这意味着您需要将要从s3获取的文件夹的文件路径传递到您的集群中。语法为:
s3://{s3 bucket path}/EMR_Config.py#EMR_Config.py
其中,标签是您使用的分隔符,(#)之前的部分是您的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"))https://stackoverflow.com/questions/24946945
复制相似问题