有没有办法在不使用spark-submit脚本的情况下使用yarn-cluster模式运行pyspark脚本?我需要这样,因为我会将此代码集成到django Web应用程序中 .
当我尝试在纱线群集模式下运行任何脚本时,我收到以下错误:
org.apache.spark.SparkException: Detected yarn-cluster mode, but isn't running on a cluster. Deployment to YARN is not supported directly by SparkContext. Please use spark-submit.
我正在以下列方式创建sparkContext:
conf = (SparkConf()
.setMaster("yarn-cluster")
.setAppName("DataFrameTest"))
sc = SparkContext(conf = conf)
#Dataframe code ....
谢谢
1 回答
不支持
yarn-cluster
模式的原因是yarn-cluster
表示将驱动程序本身(例如使用SparkContext调用的程序)引导到YARN容器上 . 从您关于从django Web应用程序提交的声明中猜测,听起来您希望将包含SparkContext的python代码嵌入到Web应用程序本身中,而不是将驱动程序代码发送到YARN容器,然后该容器处理单独的spark作业 .这意味着您的案例最接近
yarn-client
模式而不是yarn-cluster
;在yarn-client
模式下,您可以在任何地方运行SparkContext代码(例如在您的Web应用程序内部),同时与YARN讨论运行作业的实际机制 .从根本上说,如果你能够切断Spark部分以在YARN容器内运行,这就是
yarn-cluster
试图做的事情 . 如果你没有共享状态,那么你可以简单地调用一个实际上调用spark-submit
的子进程来捆绑一个独立的PySpark作业以在yarn-cluster
模式下运行 .总结一下:
如果要将Spark代码直接嵌入Web应用程序,则需要使用
yarn-client
模式:SparkConf() . setMaster("yarn-client")如果Spark代码松散耦合到
yarn-cluster
实际上是可行的,你可以发出一个Python subprocess来实际调用yarn-cluster
模式中的spark-submit
.