python - 在 Spark 工作人员上更改 PYSPARK_PYTHON
问题描述
我们分发使用 Spark 的 Python 应用程序和 Python 3.7 解释器(python.exe
所有必要的库都在附近MyApp.exe
)。
设置PYSPARK_PYTHON
我们有一个函数来确定我们的路径python.exe
:
os.environ['PYSPARK_PYTHON'] = get_python()
在 WindowsPYSPARK_PYTHON
上将成为C:/MyApp/python.exe
在 UbuntuPYSPARK_PYTHON
上将成为/opt/MyApp/python.exe
我们启动主/驱动节点并SparkSession
在 Windows 上创建。然后我们在 Ubuntu 上启动工作节点,但工作节点失败:
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
当然,C:/MyApp/python.exe
在 ubuntu 上是没有的。
如果我正确理解此错误,PYSPARK_PYTHON
则驱动程序将发送给所有工作人员。
还尝试设置PYSPARK_PYTHON
和。我怎样才能改变Ubuntu 工作者成为?spark-env.sh
spark-defaults.conf
PYSPARK_PYTHON
/opt/MyApp/python.exe
解决方案
浏览源代码,看起来 Python 驱动程序代码在创建运行 Python 函数的工作项时将 Python 可执行路径的值从其 Spark 上下文中放入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)
然后 PythonPythonRunner.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)
...
}
...
}
基于此,恐怕目前似乎不可能在 master 和 worker 中对 Python 可执行文件进行单独的配置。另请参阅发布SPARK-26404的第三条评论。也许您应该向 Apache Spark 项目提交 RFE。
虽然我不是 Spark 专家,但可能仍然有办法做到这一点,也许通过设置PYSPARK_PYTHON
为 just"python"
然后确保系统PATH
进行了相应配置,以便您的 Python 可执行文件首先出现。
推荐阅读
- android - Android 将音频/mp3 文件保存到外部存储
- html - 为绝对位置元素应用相对位置。(相对于子 div)
- botframework - 使用 Microsoft BotFramework SDK 的限制是什么?
- nashorn - Nashorn javascript引擎-java8中的加法运算
- xml - 如何在 Android Studio 中的 strings.xml 文件中的 XML 中添加换行符
- c++ - 如何使用 C++ 代码强制 GCC 在静态库中生成唯一符号
- python - 计算数据帧所有行之间3d点的成对欧几里得距离
- node.js - 如何更改 nodejs 中的响应正文?
- java - JavaFX MediaView 渲染白色视频
- azure-ad-b2c - AzureAD 如何知道该设备是否已注册?