我想通过spark-submit运行一个非常简单的pyspark应用。我通过在AWS EMR web-console
中添加一个步骤来启动应用程序,然后从s3
中选择应用程序,然后选择deploy mode cluster
,其余部分留空。
from pyspark.sql.types import IntegerType
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
mylist = [1, 2, 3, 4]
df = spark.createDataFrame(mylist, IntegerType())
df.write.parquet('s3:/path/to/save', mode='overwrite')
现在,当我执行此操作时,火花作业会正确启动,但不会添加任何工作程序。 这是纱线的样子,我在那里有一个工人:
这就是未分配工作节点的火花作业视图的样子
在EC2上使用“自制”群集之前,我总是需要像这样将config
添加到SparkSession.builder.getOrCreate()
:
from pyspark import SparkConf
conf = SparkConf().setAppName('EMR_test').setMaster('spark://MASTERDNS:7077')
spark = SparkSession.builder.config(conf=conf).getOrCreate()
但是当我这样做时,我只会得到一个19/07/31 10:19:28 WARN StandaloneAppClient$ClientEndpoint: Failed to connect to master MASTERDNS:7077
我也尝试了spark-submit --master yarn
和SparkConf().setAppName('EMR_test').setMaster('yarn-cluster')
无济于事。在这两种情况下,我的spark应用程序都没有执行程序。
那么我该如何正确执行呢?当我启动pyspark console
或Livy Notebook
时,我得到了带有分配的工作程序节点的工作spark
会话。
答案 0 :(得分:0)
我在spark-submit
的文档中找到了这一点。
对于Python应用程序,只需将.py文件代替JAR传递,然后使用--py-files将Python .zip,.egg或.py文件添加到搜索路径。
添加参数--py-files。
答案 1 :(得分:0)
好的,我解决了。默认情况下,Amazon EMR Web UI传递以下信息:
spark-submit --deploy-mode cluster s3://mybucket/EMR_test.py
我偶然删除了--deploy-mode cluster
并不能正常工作,并且一切正常,我的工作得到了执行者。就这样...
为使您在首次使用EMR Web UI时更加烦恼,您可以从下拉菜单中选择deploy-mode
或cluster
的两个选项。您显然想要client
,因为cluster
只会在主服务器上运行脚本。但是client
将永远无法工作。
附录:
我通过它做了更多的自我工作,问题与cluster
的{{1}}选项有关(如果已启用)(默认为Dynamic Resource Allocation
){ {1}}将不起作用,而是您必须使用spark
或什么都不用。如果关闭了动态资源分配,则AWS EMR
可行。