如何在Amazon EMR上引导Python模块的安装?

时间:2015-07-20 19:41:13

标签: python amazon-web-services apache-spark emr

我想做一些非常基本的事情,只需通过EMR控制台启动Spark集群并运行依赖于Python包的Spark脚本(例如,Arrow)。这种做法最直接的方法是什么?

5 个答案:

答案 0 :(得分:36)

最直接的方法是创建一个包含安装命令的bash脚本,将其复制到S3,并从控制台设置引导操作以指向脚本。

以下是我在制作中使用的一个例子:

  

S3://mybucket/bootstrap/install_python_modules.sh

#!/bin/bash -xe

# Non-standard and non-Amazon Machine Image Python modules:
sudo pip install -U \
  awscli            \
  boto              \
  ciso8601          \
  ujson             \
  workalendar

sudo yum install -y python-psycopg2

答案 1 :(得分:4)

简而言之,有两种方法可以使用pip安装软件包,具体取决于平台。首先,安装所需的任何内容,然后运行Spark步骤。最简单的方法是使用emr-4.0.0和' command-runner.jar':

from boto.emr.step import JarStep
>>> pip_step=JarStep(name="Command Runner",
...             jar="command-runner.jar",
...             action_on_failure="CONTINUE",
...             step_args=['sudo','pip','install','arrow']
... )
>>> spark_step=JarStep(name="Spark with Command Runner",
...                    jar="command-runner.jar",
...                    step_args=["spark-submit","/usr/lib/spark/examples/src/main/python/pi.py"]
...                    action_on_failure="CONTINUE"
)
>>> step_list=conn.add_jobflow_steps(emr.jobflowid, [pip_step,spark_step])

在2.x和3.x上,您以类似的方式使用script-runner.jar,但必须指定scriptrunner的完整URI。

编辑: 对不起,我没有看到你想通过控制台这样做。您也可以在控制台中添加相同的步骤。第一步是Customer JAR,其具有与上述相同的args。第二步是火花步骤。希望这有帮助!

答案 2 :(得分:2)

根据您使用的是Python 2(EMR中的默认值)还是Python 3,pip install命令应该有所不同。 按照noli's answer中的建议,您应该创建一个Shell脚本,将其上传到S3中的存储桶,并将其用作Bootstrap action

对于Python 2(在Jupyter中:用作pyspark内核的默认设置):

#!/bin/bash -xe
sudo pip install your_package

对于Python 3(在Jupyter中:是Python 3和 pyspark3 内核的默认设置):

#!/bin/bash -xe
sudo pip-3.4 install your_package

答案 3 :(得分:1)

这篇文章使我开始正确的道路,但最终我以另一种解决方案结束了。

boostrap.sh

#!/bin/bash

sudo python3 -m pip install \
    botocore \
    boto3 \
    ujson \
    warcio \
    beautifulsoup4  \
    lxml

create_emr_cluster.sh

#!/bin/bash

pem_file="~/.ssh/<your pem file>.pem"
bootstrap_path="s3://<path without filename>/"
subnet_id="subnet-<uniuqe subnet id>"
logs_path="s3://<log directory (optional)>/elasticmapreduce/"

aws s3 cp ./bootstrap.sh $bootstrap_path

ID=$(aws emr create-cluster \
--name spark-data-processing \
--use-default-roles \
--release-label emr-5.30.1 \
--instance-count 2 \
--application Name=Spark Name=Hive Name=Ganglia Name=Zeppelin \
--ec2-attributes KeyName=<your pem file>,SubnetId=$subnet_id \
--instance-type m4.large \
--bootstrap-actions Path=${bootstrap_path}bootstrap.sh \
--query ClusterId \
--output text \
--log-uri ${logs_path})

credit to的帮助

答案 4 :(得分:1)

对于 Python 3 - 创建一个 bash 脚本:

#!/bin/bash -xe
sudo pip3 install your_package

将其复制到 S3,并从控制台设置引导操作以指向您的脚本。