Apache spark Pyspark纱线簇模式

Apache spark Pyspark纱线簇模式,apache-spark,yarn,pyspark,Apache Spark,Yarn,Pyspark,是否有任何方法可以在不使用spark submit脚本的情况下使用纱线集群模式运行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

是否有任何方法可以在不使用spark submit脚本的情况下使用纱线集群模式运行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 ....

感谢不支持
纱线簇
模式的原因是
纱线簇
意味着将驱动程序本身(例如,使用SparkContext调用的程序)引导到纱线容器上。从您关于从django web应用程序提交的声明中猜测,听起来您希望包含SparkContext的python代码嵌入web应用程序本身,而不是将驱动程序代码发送到Thread容器中,然后再处理单独的spark作业

这意味着您的案例最适合
纱线客户机
模式,而不是
纱线簇
;在
Thread client
模式下,你可以在任何地方运行你的SparkContext代码(比如在你的web应用程序中),同时它与Thread对话,了解运行作业的实际机制

基本上,如果您在web应用程序和Spark code之间共享任何内存状态,这意味着您将无法切掉Spark部分以在纱线容器中运行,而这正是
纱线簇
试图做到的。如果您不共享状态,那么您可以简单地调用一个子流程,该子流程实际上调用了
spark submit
,以绑定一个独立的PySpark作业,使其在
warn cluster
模式下运行

总结如下:

  • 如果您想将Spark代码直接嵌入web应用程序中,则需要使用
    纱线客户端
    模式:SparkConf().setMaster(“纱线客户端”)
  • 如果Spark代码松散耦合,以至于
    纱线集群
    实际上是可行的,那么您可以发出Python命令,在
    纱线集群
    模式下实际调用
    Spark submit

  • Python虚拟环境使这个过程更加复杂。现在,我正在使用一个单独的工作进程来获取web应用程序排队的作业。此工作人员调用
    spark submit
    。我正在尝试与应用程序和工作人员共享虚拟环境。但是,当我在
    客户机
    模式下调用Thread时,它引用了虚拟环境中的Python版本。我是不是错过了什么?我如何告诉Spark使用安装在节点上的Python,而不是虚拟环境中的Python?@Michael在我的Spark提交中,我通过Spark作业传递了一个虚拟环境,并从其中引用Python来运行我的Python代码,因为我无法控制我公司的工作人员(只有代码),1制作一个与worker OS二进制兼容的python环境(我使用了docker容器),然后发布并引用该虚拟环境。要发布它--请使用:--存档python35.zip#我的别名,然后告诉spark使用它--
    --conf“spark.warn.appMasterEnv.PYSPARK_PYTHON=./MY_别名/python35/bin/python3”
    希望这能有所帮助。