2016-11-28 15 views
0

通常我使用yarn-client模式在驱动程序中运行带有不同版本Python的代码,而不是在工作节点中运行我的代码。pyspark api在纱线客户端模式中调用同一个Python版本的工人

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

目前我在一个项目中,我们需要调用

sqlContext.createDataFrame 

但这似乎尝试在Python中的工人来执行这句话,然后我得到了在安装Python的同一版本的要求工人,这是我想要避免的。

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

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

感谢, 何塞

回答

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

但是,所有其余的api调用并不需要在工人中使用相同的python。为什么这需要它?例如,toPandas()不需要这个。 –

+0

一般而言,Spark在每台机器上都需要相同版本的Python。 API的某些部分不使用Python执行程序,因此您永远不会遇到代码失败的情况。但它并没有成功。 – 2016-11-28 12:14:26

1

通常,许多pyspark操作只是调用JVM上的spark操作的包装。对于这些操作,在worker中使用什么版本的python并不重要,因为没有在worker上执行python,只有JVM操作。这样的操作的

例子包括从文件中读取数据帧一个,其不需要Python对象/函数作为输入等

一旦功能需要的实际Python对象或所有内置函数起作用这变得有点棘手。 比方说,您想要使用UDF并使用lambda x:x + 1作为函数。 Spark并不真正知道这个函数是什么。相反,它序列化并将其发送给反序列化的工作人员。

要使此序列化/反序列化过程正常工作,双方的版本需要兼容,而且通常并非如此(特别是在主要版本之间)。

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

相关问题