如何在代码中通过引导操作在Amazon EMR上安装自定义包?

5 投票
1 回答
5842 浏览
提问于 2025-04-18 03:22

我需要在亚马逊EMR的启动操作中安装一些软件包和二进制文件,但找不到相关的例子。

简单来说,我想安装一个Python包,并指定每个Hadoop节点使用这个包来处理S3桶里的数据,这里有一个来自boto的示例。

                      name='Image to grayscale using SimpleCV python package',
                      mapper='s3n://elasticmapreduce/samples/imageGrayScale.py',
                      reducer='aggregate',
                      input='s3n://elasticmapreduce/samples/input',
                      output='s3n://<my output bucket>/output'

我需要让它使用SimpleCV这个Python包,但不太确定在哪里指定这个包。如果这个包没有安装,我该怎么让它安装呢?有没有办法避免等待安装完成?是否可以先安装到某个地方,然后只引用这个Python包呢?

1 个回答

7

有一个类叫做 boto.emr.bootstrap_action.BootstrapAction,它是用来处理启动操作的。

你可以像下面这样定义它。大部分代码来自于 boto 示例页面

import boto.emr
from boto.emr.bootstrap_action import BootstrapAction

action = BootstrapAction(name="Bootstrap to add SimpleCV",
                         path="s3n://<my bucket uri>/bootstrap-simplecv.sh")

conn = boto.emr.connect_to_region('us-west-2')
jobid = conn.run_jobflow(name='My jobflow',
                         log_uri='s3://<my log uri>/jobflow_logs',
                         steps=[step],  # step defined elsewhere
                         bootstrap_actions=[action])

接下来,你需要定义启动操作。如果你需要使用不同版本的Python,那么在同一台电脑上预先编译好、打包成tar文件,然后放到S3存储桶里,最后在启动时解压,这样会节省时间。

#!/bin/sh
# filename: bootstrap-simplecv.sh  (save it in an S3 bucket)
set -e -x

sudo apt-get install python-setuptools
sudo easy_install pip 
sudo pip install -U SimpleCV

我觉得你可以通过boto让EMR实例保持运行状态,这样启动操作只会在你会话的第一次执行。只要记得在你登出之前关闭这些实例,以免账单上出现意外费用。

撰写回答