我想做一些非常基本的事情,只需通过EMR控制台启动Spark集群并运行依赖于Python包的Spark脚本(例如,Arrow)。这种做法最直接的方法是什么?
答案 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,并从控制台设置引导操作以指向您的脚本。