yarn-cluster 模式下的 Pyspark

Pyspark on yarn-cluster mode

有什么方法可以在不使用 spark-submit 脚本的情况下使用 yarn-cluster 模式 运行 pyspark 脚本吗?我以这种方式需要它,因为我会将这段代码集成到 Django 网络应用程序中。

当我尝试 运行 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 ....

谢谢

不支持 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 容器内的 运行 ,这就是 yarn-cluster 试图做的。如果您不共享状态,那么您可以简单地调用一个子进程,该子进程实际上会调用 spark-submityarn-cluster 模式将独立的 PySpark 作业捆绑到 运行。

总结一下:

  1. 如果您想将您的 Spark 代码直接嵌入到您的网络应用程序中,您需要改用 yarn-client 模式:SparkConf().setMaster("yarn-client")
  2. 如果 Spark 代码足够松散以至于 yarn-cluster 实际上可行,您可以发出 Python subprocess 以在 [=10= 中实际调用 spark-submit ]模式。