Просматривая исходный код, похоже, что код драйвера Python помещает значение исполняемого пути Python из контекста Spark при создании рабочих элементов для запуска функций Python в spark/rdd.py
:
def _wrap_function(sc, func, deserializer, serializer, profiler=None):
assert deserializer, "deserializer should not be empty"
assert serializer, "serializer should not be empty"
command = (func, profiler, deserializer, serializer)
pickled_command, broadcast_vars, env, includes = _prepare_for_python_RDD(sc, command)
return sc._jvm.PythonFunction(bytearray(pickled_command), env, includes, sc.pythonExec,
^^^^^^^^^^^^^
sc.pythonVer, broadcast_vars, sc._javaAccumulator)
Затем бегун Python PythonRunner.scala
использует путь, сохраненный в первом полученном рабочем элементе, для запуска новых экземпляров интерпретатора:
private[spark] abstract class BasePythonRunner[IN, OUT](
funcs: Seq[ChainedPythonFunctions],
evalType: Int,
argOffsets: Array[Array[Int]])
extends Logging {
...
protected val pythonExec: String = funcs.head.funcs.head.pythonExec
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
def compute(
inputIterator: Iterator[IN],
partitionIndex: Int,
context: TaskContext): Iterator[OUT] = {
...
val worker: Socket = env.createPythonWorker(pythonExec, envVars.asScala.toMap)
...
}
...
}
Исходя из этого, я боюсь, что в настоящее время кажется невозможным иметь отдельные конфигурации для исполняемого файла Python в мастере и в рабочих. Также см. Третий комментарий к выпуску SPARK-26404 . Возможно, вам следует подать RFE в проект Apache Spark.
Я не гуру Spark, и, возможно, есть способ сделать это, возможно, установив PYSPARK_PYTHON
просто "python"
и затем убедитесь, что система PATH
настроена соответствующим образом, чтобы ваш исполняемый файл Python был первым.