纱线集群模式下的 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() 使用配置文件自动设置本地或纱线集群

如何提高纱线应用并行度

在火花集群模式下运行 zeppelin

使用远程 jvm 在纱线集群上提交火花作业时出现异常

sparklyr 可以与部署在纱线管理的 hadoop 集群上的 spark 一起使用吗?

Spark 中的纱线客户端模式是啥?