【问题标题】:Python Dependency Management on EMREMR 上的 Python 依赖管理
【发布时间】:2013-07-07 16:00:55
【问题描述】:
我正在通过 mrjob/boto 模块向亚马逊的 EMR 发送代码。我有一些外部 python 依赖项(即 numpy、boto 等),目前必须下载 python 包的源代码,并将它们作为 tarball 发送到 mrjob.config 文件的“python_archives”字段中。
这使得依赖管理比我想要的更混乱,我想知道我是否可以以某种方式使用我用于我的 virtualenv 设置的相同 requirements.txt 文件来引导带有我的依赖项的 emr 实例。是否可以在 EMR 实例上设置 virtualenv 并执行以下操作:
pip install -r requirements.txt
就像我在本地一样?
【问题讨论】:
标签:
python
virtualenv
pip
elastic-map-reduce
mrjob
【解决方案1】:
所以,如果您使用的是 mrjob,我只需将 pip 调用作为引导操作直接放入我的 .mrjob.conf 文件中就已经取得了一些成功。它不像使用 requirements.txt 文件那么优雅(它将为您的所有工作加载相同的模块)。例如,我的 conf 文件如下所示:
runners:
emr:
aws_access_key_id: xx
aws_secret_access_key: xx
ec2_key_pair: xx
ec2_key_pair_file: xx
ssh_tunnel_to_job_tracker: true
bootstrap_cmds:
- sudo apt-get install -y python-pip
- sudo pip install pgnparser
- sudo pip install boto
这将加载pgnparser 和boto 模块供我在mrjob 脚本中使用。
【解决方案2】:
实现此目的的一种方法是使用bootstrap action。您可以使用它们来运行 shell 脚本。
如果您有一个设置 python 文件,它执行以下操作:
requirements = open("requirements.txt", "r")
shell_script = open("pip.sh", "w+")
shell_script.write("sudo apt-get install python-pip\n")
for line in requirements:
shell_script.write("sudo pip install -I " + line)
然后您可以将其作为引导操作运行,而无需上传您的 requirements.txt