在EMR上运行pyspark脚本

时间:2014-04-25 20:13:26

标签: python apache-spark

我目前使用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)有一种更简单的方法。非常感谢提前!

3 个答案:

答案 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部分)的一部分传递给脚本。
  • Be aware在配置作业时,您必须使用s3a:// URI代替s3n://s3://来支持Hadoop 2.7+。
  • 如果您的群集位于VPC中,如果您打算在EMR作业中读取/写入,则需要创建VPC Endpoint for Amazon S3

答案 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访问脚本。