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

Posted

技术标签:

【中文标题】如何在 Amazon EMR 上引导安装 Python 模块?【英文标题】:How to bootstrap installation of Python modules on Amazon EMR? 【发布时间】:2015-10-10 01:52:49 【问题描述】:

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

【问题讨论】:

【参考方案1】:

最直接的方法是创建一个包含安装命令的 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

【讨论】:

这会将软件包安装在 EMR 集群中的一个节点上。如何确保软件包安装在所有节点上? 这会在所有节点上安装包 这不适用于 Python3。我正在尝试安装熊猫。有什么新建议吗? @EvanZamir 检查我的答案,您需要在脚本中使用 pip-3.4 而不是 ***.com/a/51210608/3424322 这不遵循使用 requirements.txt 来包含需求的典型约定。为了允许本地和远程执行,您应该使用 aws s3 cp 将 requirements.txt 复制到本地文件夹,然后在从 s3 复制需求文件后使用 pip install -y requirements.txt 安装。【参考方案2】:

简而言之,有两种方法可以使用 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。

编辑: 抱歉,我没有看到您想通过控制台执行此操作。您也可以在控制台中添加相同的步骤。第一步将是一个具有与上述相同参数的客户 JAR。第二步是火花步骤。希望这会有所帮助!

【讨论】:

conn 来自哪里【参考方案3】:

根据您使用的是 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

【讨论】:

如果您使用的是使用 python 3.4 的特定 EMR,这可以正常工作。这需要针对每个 EMR 版本单独检查。例如emr-5.21.0 使用python-3.6,因此您需要将pip 调整为pip-3.6,因此这不是一刀切的解决方案。 另一个注意事项是,如果您想在使用两个版本的 pip 安装时摆脱整个 stderr 日志,以下内容将有助于您的引导操作 shell 脚本:sudo sed -i -e 's/$OLD_PIP_VERSION/$PIP_VERSION/g' /usr/bin/pip-3.6,基于指定的版本 sudo pip3 install.. 会绕过版本标记问题吗? #! /bin/bash -xe ; sudo pip-3.6 install boto3 为我工作【参考方案4】:

这篇文章让我开始走上正确的道路,但最终我选择了不同的解决方案。

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_pathbootstrap.sh \
--query ClusterId \
--output text \
--log-uri $logs_path)

credit to他的帮助

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于如何在 Amazon EMR 上引导安装 Python 模块?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EMR - 从设备上的 Yum 更新引导操作失败

Amazon EMR + mrjob:引导错误,“引导操作 1 返回非零返回码”

即使在引导程序中安装 pip 后,导入也无法在 Amazon EMR 中工作

在 Amazon EMR 中运行的 Pig 作业的引导文件的路径是啥

在 Amazon EMR 4.1 和 Amazon EC2 上安装 Impala

在 Amazon EMR 上为 Pig UDF 加载外部 python 模块