什么pyspark api调用在yarn-client模式下的工作者中需要相同版本的python

时间:2016-11-28 11:07:59

标签: apache-spark pyspark pyspark-sql

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

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

我目前正处于需要致电

的项目中
sqlContext.createDataFrame

但是这似乎试图在python中执行这个句子,然后我得到了在工作者中安装相同版本的python的要求,这是我想要避免的。

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

如果是这样,其他“纯”pyspark.sql api调用也会有这个要求吗?

谢谢, 何

2 个答案:

答案 0 :(得分:1)

  • 是的,一般来说,同样的Python版本是必需的。某些API调用可能不会失败,因为没有使用Python执行程序,但它不是有效的配置。
  • 每次与Python代码交互的调用(例如udfDataFrame.rdd.*)都会触发相同的异常。
  • 如果您想避免升级群集Python,请在驱动程序上使用Python 2.

答案 1 :(得分:1)

通常,许多pyspark操作只是在JVM上调用spark操作的包装器。对于这些操作,无论在worker中使用什么版本的python都没关系,因为在worker上没有执行python,只有JVM操作。

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

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

要使此序列化/反序列化过程起作用,双方的版本需要兼容,而且通常不是这种情况(特别是在主要版本之间)。

所有这些都将我们引向了createDataFrame。例如,如果您使用RDD作为参数之一,则RDD将包含python对象作为记录,这些对象需要序列化和反序列化,因此必须具有相同的版本。