通常,我使用YARN-CLIENT模式在驱动程序中与驱动程序中不同版本的Python运行代码。
例如,我通常在驱动程序中使用python3.5,工人中的默认python2.6使用,这很漂亮。
我目前正在一个我们需要致电
的项目中sqlContext.createDataFrame
但这似乎试图在工人的python中执行此句子,然后我需要在工人中安装相同版本的Python,这是我要避免的。
因此,对于使用" sqlcontext.CreateDataFrame",在驱动程序和工人中具有相同的Python版本是必需的吗?
,如果是这样,哪些其他"纯" pyspark.sql api调用也将有此要求?
谢谢何塞
- 是的,相同的python方面通常是要求。某些API调用可能不会失败,因为没有使用Python执行程序,但它不是有效的配置。
- 与Python代码相互作用的每个呼叫,例如
udf
或DataFrame.rdd.*
,都会触发相同的例外。 - 如果要避免升级群集python,则在驱动程序上使用Python 2。
通常,许多Pyspark操作只是在JVM上调用Spark操作的包装器。对于这些操作,工人中使用了哪种版本的python,因为在工人上没有执行python,只有JVM操作。
此类操作的示例包括从文件中读取数据框,所有不需要python对象/函数的内置功能作为输入等。
函数需要一个实际的python对象或功能,这会变得更棘手。假设您要使用UDF并将lambda x:x 1用作函数。Spark真的不知道该功能是什么。取而代之的是将其序列化并将其发送给依次对其进行除外的工人。
对于此序列化/除外序列化过程,双方的版本需要兼容,而且通常不是这种情况(尤其是在主要版本之间)。
所有这些都使我们进入了创建。例如,如果将RDD用作参数之一,则RDD将包含python对象作为记录,并且需要序列化和去序列化,因此必须具有相同的版本。