纱线集群模式下的 Pyspark
Posted
技术标签:
【中文标题】纱线集群模式下的 Pyspark【英文标题】:Pyspark on yarn-cluster mode 【发布时间】:2015-07-09 20:11:11 【问题描述】:有没有办法在不使用 spark-submit 脚本的情况下以 yarn-cluster 模式运行 pyspark 脚本?我需要这种方式,因为我会将这段代码集成到 django web 应用程序中。
当我尝试在 yarn-cluster 模式下运行任何脚本时,出现以下错误:
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 代码,同时它与 YARN 对话以了解运行作业的实际机制。
从根本上说,如果您在 Web 应用程序和 Spark 代码之间共享任何内存状态,这意味着您将无法切断 Spark 部分以在 YARN 容器中运行,这就是 @987654327 @尝试做。如果您不共享状态,那么您可以简单地调用一个实际上调用spark-submit
的子进程来捆绑一个独立的PySpark 作业以在yarn-cluster
模式下运行。
总结一下:
-
如果您想将 Spark 代码直接嵌入到您的 Web 应用程序中,则需要改用
yarn-client
模式:SparkConf().setMaster("yarn-client")
如果 Spark 代码足够松散耦合,yarn-cluster
实际上是可行的,您可以发出 Python subprocess 以在 yarn-cluster
模式下实际调用 spark-submit
。
【讨论】:
Python 虚拟环境使这个过程更加复杂。现在,我正在使用一个单独的工作进程来获取 Web 应用程序排队的工作。该工作人员致电spark-submit
。我正在尝试与应用程序和工作人员共享虚拟环境。但是,当我在 client
模式下调用 yarn 时,它会从我的虚拟环境中引用 Python 版本。我只是错过了什么吗?如何告诉 Spark 使用安装在节点上的 Python 而不是虚拟环境中的 Python?
@Michael 在我的 spark-submit 中,我通过 spark 作业传递了一个虚拟环境,并从那里引用 python 来运行我的 python 代码,因为我无法控制我公司中的工人只有代码。)它有 2 个部分,1 个创建一个与您的工作操作系统二进制兼容的 python env(我使用了一个 docker 容器),然后发送和引用该虚拟 env。要发布它——使用:--archives python35.zip#MY_ALIAS,然后告诉 spark 使用它——--conf "spark.yarn.appMasterEnv.PYSPARK_PYTHON=./MY_ALIAS/python35/bin/python3"
希望这会有所帮助。以上是关于纱线集群模式下的 Pyspark的主要内容,如果未能解决你的问题,请参考以下文章
在火花代码管理 conf.setMaster() 使用配置文件自动设置本地或纱线集群