【发布时间】:2015-10-10 01:52:49
【问题描述】:
我想做一些非常基本的事情,只需通过 EMR 控制台启动 Spark 集群并运行依赖于 Python 包的 Spark 脚本(例如,Arrow)。最直接的方法是什么?
【问题讨论】:
标签: python amazon-web-services apache-spark emr
我想做一些非常基本的事情,只需通过 EMR 控制台启动 Spark 集群并运行依赖于 Python 包的 Spark 脚本(例如,Arrow)。最直接的方法是什么?
【问题讨论】:
标签: python amazon-web-services apache-spark emr
最直接的方法是创建一个包含安装命令的 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
【讨论】:
aws s3 cp 将 requirements.txt 复制到本地文件夹,然后在从 s3 复制需求文件后使用 pip install -y requirements.txt 安装。
简而言之,有两种方法可以使用 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 来自哪里
根据您使用的是 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
【讨论】:
emr-5.21.0 使用python-3.6,因此您需要将pip 调整为pip-3.6,因此这不是一刀切的解决方案。
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 为我工作
这篇文章让我开始走上正确的道路,但最终我选择了不同的解决方案。
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他的帮助
【讨论】:
对于 Python 3 - 创建一个 bash 脚本:
#!/bin/bash -xe
sudo pip3 install your_package
将其复制到 S3,并从控制台设置引导操作以指向您的脚本。
【讨论】: