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 进行适当调整,因为它是同一台机器)有效。没有问题没有问题。鉴于文档明确指出了其他情况,这有何意义?
您尝试从 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)
一个简单的部署策略是
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 -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 项目完成的
| 归档时间: |
|
| 查看次数: |
5631 次 |
| 最近记录: |