如何让pyspark在emr集群上运行代码

the*_*ter 4 port amazon-emr apache-spark pyspark devops

我们使用 python 和 pyspark api 来在 Spark 集群上运行简单的代码。

from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName('appName').setMaster('spark://clusterip:7077')
sc = SparkContext(conf=conf)

rdd = sc.parallelize([1, 2, 3, 4])
rdd.map(lambda x: x**2).collect()
Run Code Online (Sandbox Code Playgroud)

当我们在本地并使用 docker 设置 Spark 集群时,它就可以工作。

我们现在想要启动一个 emr 集群并测试相同的代码。并且似乎 pyspark 无法连接到 emr 上的 Spark 集群

我们从我们的机器向 Spark Master 打开端口 8080 和 7077

我们正在穿越防火墙,但似乎没有任何东西在侦听端口 7077,并且我们的连接被拒绝。

我们发现解释了如何使用 cli 提供作业,但我们需要直接从驱动程序上的 pyspark api 运行它。

我们在这里缺少什么?

如何启动 emr 集群并使用该集群在 python 上本地运行 pyspark 代码?

编辑:从主站本身运行此代码是有效的与建议的相反,当使用 ssh 连接到主站并从终端运行 python 时,完全相同的代码(对主站 IP 进行适当调整,因为它是同一台机器)有效。没有问题没有问题。鉴于文档明确指出了其他情况,这有何意义?

dre*_*-hh 6

您尝试从 Spark 集群外部的远程计算机运行 pyspark(调用 Spark-submit)。这在技术上是可行的,但这不是部署应用程序的预期方式。在yarn模式下,它会让你的计算机作为客户端参与spark协议。因此,需要打开多个端口并安装与 Spark aws emr 上完全相同的 Spark jar。

形成Spark 提交文档

 A common deployment strategy is to submit your application from a gateway machine that is physically co-located with your worker machines (e.g. Master node in a standalone EC2 cluster)
Run Code Online (Sandbox Code Playgroud)

一个简单的部署策略是

  • 通过 rsync、scp 或 git 将代码同步到主节点
cd ~/projects/spark-jobs # on local machine
EMR_MASTER_IP='255.16.17.13'
TARGET_DIR=spark_jobs
rsync -avze "ssh -i ~/dataScienceKey.pem" --rsync-path="mkdir -p ${TARGET_DIR} && rsync" --delete ./ hadoop@${EMR_MASTER_IP}:${TARGET_DIR}
Run Code Online (Sandbox Code Playgroud)
  • ssh 到主节点
ssh -i ~/dataScienceKey.pem hadoop@${EMR_HOST}
Run Code Online (Sandbox Code Playgroud)
  • spark-submit在主节点上运行
cd spark_jobs
spark-submit --master yarn --deploy-mode cluster my-job.py
Run Code Online (Sandbox Code Playgroud)
# my-job.py
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("my-job-py").getOrCreate()
sc = spark.sparkContext
rdd = sc.parallelize([1, 2, 3, 4])
res = rdd.map(lambda x: x**2).collect()
print(res)

Run Code Online (Sandbox Code Playgroud)

有一种方法可以直接将作业提交到spark emr,无需同步。Spark EMR默认在端口上运行Apache Livy 。8998它是一个 REST Web 服务,允许通过 REST API 提交作业。您可以spark-submit使用curl计算机上的脚本传递相同的参数。参见文档

对于交互式开发,我们还配置了本地运行jupyter notebooks ,它会自动将单元运行提交给 livy。这是通过Spark-magic 项目完成的