基于EMR的Python依赖关系管理

基于EMR的Python依赖关系管理,python,virtualenv,pip,elastic-map-reduce,mrjob,Python,Virtualenv,Pip,Elastic Map Reduce,Mrjob,我通过mrjob/boto模块向amazon的EMR发送代码。我有一些外部python依赖项(即numpy、boto等),目前必须下载python包的源代码,并将它们作为tarball发送到mrjob.config文件的“python_archives”字段中 这使得依赖关系管理比我希望的更混乱,我想知道我是否可以使用virtualenv安装程序使用的相同requirements.txt文件来引导emr实例与依赖关系。是否可以在EMR实例上设置virtualenv并执行以下操作: pip ins

我通过mrjob/boto模块向amazon的EMR发送代码。我有一些外部python依赖项(即numpy、boto等),目前必须下载python包的源代码,并将它们作为tarball发送到mrjob.config文件的“python_archives”字段中

这使得依赖关系管理比我希望的更混乱,我想知道我是否可以使用virtualenv安装程序使用的相同requirements.txt文件来引导emr实例与依赖关系。是否可以在EMR实例上设置virtualenv并执行以下操作:

pip install -r requirements.txt

正如我在本地所做的那样?

实现这一点的一种方法是使用。您可以使用这些来运行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。因此,如果您使用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
脚本中使用