如何在 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 作业的引导文件的路径是啥