Apache spark pyspark api调用的内容要求在客户机模式下的workers中使用相同版本的python

Apache spark pyspark api调用的内容要求在客户机模式下的workers中使用相同版本的python,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,通常,我在驱动程序中使用不同版本的Python运行代码,而不是在工作节点中,使用Thread客户端模式 例如,我通常在驱动程序中使用python3.5,在workers中使用默认的python2.6,这非常有效 我目前在一个项目中,我们需要打电话 sqlContext.createDataFrame 但这似乎试图在workers中用python执行这句话,然后我得到了在workers中安装相同版本python的要求,这正是我试图避免的 那么,对于使用“sqlContext.createData

通常,我在驱动程序中使用不同版本的Python运行代码,而不是在工作节点中,使用Thread客户端模式

例如,我通常在驱动程序中使用python3.5,在workers中使用默认的python2.6,这非常有效

我目前在一个项目中,我们需要打电话

sqlContext.createDataFrame
但这似乎试图在workers中用python执行这句话,然后我得到了在workers中安装相同版本python的要求,这正是我试图避免的

那么,对于使用“sqlContext.createDataFrame”,驱动程序和工作程序中需要有相同的python版本吗

如果是这样的话,还有哪一个“纯”pyspark.sql api调用也有此要求

谢谢, 何塞

  • 是的,通常需要相同的Python版本。某些API调用可能不会失败,因为没有使用Python执行器,但它不是有效的配置
  • 与Python代码交互的每个调用,如
    udf
    DataFrame.rdd.*
    都会触发相同的异常
  • 如果要避免升级集群Python,请在驱动程序上使用Python 2
      • 是的,通常需要相同的Python版本。某些API调用可能不会失败,因为没有使用Python执行器,但它不是有效的配置
      • 与Python代码交互的每个调用,如
        udf
        DataFrame.rdd.*
        都会触发相同的异常
      • 如果要避免升级集群Python,请在驱动程序上使用Python 2

      通常,许多pyspark操作只是JVM上调用spark操作的包装。对于这些操作,在worker中使用哪个版本的python无关紧要,因为在worker上不执行python,只执行JVM操作

      此类操作的示例包括从文件读取数据帧、所有不需要python对象/函数作为输入的内置函数等

      一旦一个函数需要一个实际的python对象或函数,这就变得有点棘手了。 例如,假设您希望使用UDF并使用lambda x:x+1作为函数。 Spark并不知道函数是什么。相反,它会序列化它并将其发送给工作者,后者依次对其进行反序列化

      要使序列化/反序列化过程正常工作,双方的版本都需要兼容,但通常情况并非如此(尤其是在主要版本之间)


      所有这些导致我们创建数据框架。例如,如果使用RDD作为参数之一,RDD将包含python对象作为记录,这些对象需要序列化和反序列化,因此必须具有相同的版本

      一般来说,许多pyspark操作只是JVM上调用spark操作的包装器。对于这些操作,在worker中使用哪个版本的python无关紧要,因为在worker上不执行python,只执行JVM操作

      此类操作的示例包括从文件读取数据帧、所有不需要python对象/函数作为输入的内置函数等

      一旦一个函数需要一个实际的python对象或函数,这就变得有点棘手了。 例如,假设您希望使用UDF并使用lambda x:x+1作为函数。 Spark并不知道函数是什么。相反,它会序列化它并将其发送给工作者,后者依次对其进行反序列化

      要使序列化/反序列化过程正常工作,双方的版本都需要兼容,但通常情况并非如此(尤其是在主要版本之间)


      所有这些导致我们创建数据框架。例如,如果使用RDD作为参数之一,RDD将包含python对象作为记录,这些对象需要序列化和反序列化,因此必须具有相同的版本

      但是,api调用的所有其余部分不需要在worker中使用相同的python。为什么这需要它?例如,toPandas()不需要这样做,通常Spark在每台机器上都需要相同版本的Python。API的某些部分不使用Python执行器,因此您永远不会遇到代码失败的情况。但是,api调用的所有其余部分都不需要在workers中使用相同的python。为什么这需要它?例如,toPandas()不需要这样做,通常Spark在每台机器上都需要相同版本的Python。API的某些部分不使用Python执行器,因此您永远不会遇到代码失败的情况。但这并不意味着一切顺利。