在Spark workers上更改PYSPARK_PYTHON

在Spark workers上更改PYSPARK_PYTHON,python,apache-spark,ubuntu,pyspark,environment-variables,Python,Apache Spark,Ubuntu,Pyspark,Environment Variables,我们发布了使用Spark的Python应用程序,以及Python 3.7解释器(Python.exe,所有必要的libs都位于MyApp.exe附近) 要设置PYSPARK\u PYTHON,我们有一个函数,它决定了我们的PYTHON.exe的路径: os.environ['PYSPARK_PYTHON'] = get_python() 在WindowsPYSPARK\u上,PYTHON将变成C:/MyApp/PYTHON.exe 在Ubuntu上,PYSPARK_PYTHON将变成/op

我们发布了使用Spark的Python应用程序,以及Python 3.7解释器(
Python.exe
,所有必要的libs都位于
MyApp.exe
附近)

要设置
PYSPARK\u PYTHON
,我们有一个函数,它决定了我们的
PYTHON.exe
的路径:

os.environ['PYSPARK_PYTHON'] = get_python()  
在Windows
PYSPARK\u上,PYTHON
将变成
C:/MyApp/PYTHON.exe

在Ubuntu上,PYSPARK_PYTHON将变成
/opt/MyApp/PYTHON.exe

我们启动主/驱动程序节点并在Windows上创建
SparkSession
。然后我们在Ubuntu上启动worker节点,但worker失败,原因是:

Job aborted due to stage failure: Task 1 in stage 11.0 failed 4 times, most recent failure: Lost task 1.3 in stage 11.0 (TID 1614, 10.0.2.15, executor 1): java.io.IOException: Cannot run program "C:/MyApp/python.exe": error=2, No such file or directory
当然,ubuntu上没有
C:/MyApp/python.exe

如果我正确理解此错误,则会将来自驱动程序的
PYSPARK\u PYTHON
发送给所有工作人员


还尝试在
spark env.sh
spark defaults.conf
中设置
PYSPARK\u PYTHON
。如何将Ubuntu workers上的
PYSPARK\u PYTHON
更改为
/opt/MyApp/PYTHON.exe

浏览源代码,在创建用于运行PYTHON函数的工作项时,PYTHON驱动程序代码似乎将PYTHON可执行路径的值从其Spark上下文中放入:

Python运行程序然后使用它收到的第一个工作项中存储的路径来启动新的解释器实例:

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)
    ...
  }
  ...
}
基于这一点,恐怕目前不可能在master和worker中对Python可执行文件进行单独的配置。另请参见要发布的第三条评论。也许您应该向ApacheSpark项目提交RFE


虽然我不是Spark大师,但可能仍然有办法做到这一点,也许可以将
PYSPARK\u PYTHON
设置为
“PYTHON”
,然后确保相应地配置系统
PATH
,使您的PYTHON可执行文件排在第一位。

可能是因为它完全不正确?Spark用于分离驱动程序和执行程序Python exec,实际上有。是否只有一台Windows机器?Windows计算机上的Spark master是否也托管执行器?如果答案分别是“是”和“否”,你也可以尝试在Ubuntu节点上运行master。在Windows机器上,我启动master和worker。只在Ubuntu上工作。
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)
    ...
  }
  ...
}