我目前使用Sparks预配置的./ec2目录使用EC2群集自动化我的Apache Spark Pyspark脚本。出于自动化和调度的目的,我想使用Boto EMR模块将脚本发送到集群。
我能够在EMR集群上引导和安装Spark。我也可以使用我的本地机器的pyspark版本在EMR上启动一个脚本,并设置master如下:
$: MASTER=spark://<insert EMR master node of cluster here> ./bin/pyspark <myscriptname.py>
但是,这需要我在本地运行该脚本,因此我无法充分利用Boto的能力1)启动集群2)添加脚本步骤和3)停止集群。我找到了使用script-runner.sh和emr&#34; step&#34;用于spark-shell(scala)的命令,但我认为使用Python模块(pyspark)有一种更简单的方法。非常感谢提前!
答案 0 :(得分:14)
以下是great example如何配置它。浏览到&#34;一个快速示例&#34;用于Python代码。
但是,为了在emr-4.7.2中工作,必须进行一些调整,所以这里有一个适用于我的AWS CLI命令:
aws emr add-steps --cluster-id <Your EMR cluster id> --steps Type=spark,Name=TestJob,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,s3a://your-source-bucket/code/pythonjob.py,s3a://your-source-bucket/data/data.csv,s3a://your-destination-bucket/test-output/],ActionOnFailure=CONTINUE
以下是pythonjob.py
档案的内容:
from __future__ import print_function
from pyspark import SparkContext
import sys
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: testjob ", file=sys.stderr)
exit(-1)
sc = SparkContext(appName="MyTestJob")
dataTextAll = sc.textFile(sys.argv[1])
dataRDD = dataTextAll.map(lambda x: x.split(",")).map(lambda y: (str(y[0]), float(y[1]))).reduceByKey(lambda a, b: a + b)
dataRDD.saveAsTextFile(sys.argv[2])
sc.stop()
它从S3读取data.csv
文件,拆分每一行,将第一个值转换为字符串,第二个转换为浮点数,按第一个值分组,并将第二列中的值相加,然后将结果写回S3
一些评论:
spark.yarn.submit.waitAppCompletion=true
我可以在控制台中监视作业执行情况。 sys.argv[1]
和sys.argv[2]
)作为作业sumbission(Args
命令中的add-steps
部分)的一部分传递给脚本。s3a://
URI代替s3n://
和s3://
来支持Hadoop 2.7+。 答案 1 :(得分:4)
虽然它不使用boto,但这可能会有所帮助。
使用aws cli创建群集并向其添加步骤(spark job)。
1)创建集群:
aws emr create-cluster --name "Spark cluster" --ami-version 3.8 --applications Name=Spark --ec2-attributes KeyName=ir --log-uri s3://Path/logs --instance-type m3.xlarge --instance-count 1 --use-default-roles
2)添加步骤(火花作业)。请注意,您的python脚本应存储在主节点中(在这种情况下,它位于/ home / hadoop / spark中)。
aws emr add-steps --cluster-id j-xxxxxxx --steps Name=Spark,Jar=s3://eu-west-1.elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--deploy-mode,client,/home/hadoop/spark/myscript.py],ActionOnFailure=CONTINUE
您还可以将两个步骤合并为一个并创建群集/运行作业并终止群集。
很少有注意事项:1)我尝试了多种方法从S3读取脚本但没有运气:(
所以我最终使用boto或aws cli将其复制到节点。 2)因为我在emr中的一个节点上测试,所以步骤中的部署模式是客户端客户端,您应该将其更改为集群。
答案 2 :(得分:2)
您需要将部署模式更改为群集(而不是客户端)才能从S3访问脚本。