繁体   English   中英

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

[英]How to import local Python package in Amazon Elastic MapReduce (EMR)?

我有两个打算在Amazon Elastic MapReduce上运行的Python脚本-一个作为映射器,一个作为简化器。 我最近扩展了mapper脚本,以要求我创建了两个本地模型,它们都存在于名为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.py

而且mapper.py具有:

from SentimentAnalysis import NB, LR

我试图镜像S3中的文件结构,但这似乎不起作用。

设置S3或EMR的最佳方法是什么,以便sa_mapper.py可以导入NB.py和LR.py? 有一些特殊的技巧可以做到这一点吗?

你有

__init__.py

在SentimentAnalysis文件夹中?

您正在运行什么命令?
唯一的方法是,当您要运行step时,您必须具有该步骤的其他字段,例如:如果您使用boto包在emr上运行任务,则具有类: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"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM