2301_79603960 2026-04-06 16:34 采纳率: 75%
浏览 9
已结题

python pyspark JDK java

在JDK17环境下pyspark代码运行报错。
但是下面代码在配置环境下这段代码运行有警告错误,但是仍然能够正常运行。为什么图二报错。pyspark的版本目前是4.1.1,换成低版本和高版本的都不行,都尝试过了,有没有遇到过这种问题,应该如何解决?

img

img

D:\software\Python\Projects\pyecharts\.venv\Scripts\python.exe D:\software\Python\Projects\pyecharts\数据处理\flatMap.py 
WARNING: Using incubator modules: jdk.incubator.vector
Using Spark's default log4j profile: org/apache/spark/log4j2-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
26/04/06 16:31:39 ERROR Executor: Exception in task 7.0 in stage 0.0 (TID 7)
org.apache.spark.SparkException: Python worker failed to connect back.
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:281)
    at org.apache.spark.api.python.PythonWorkerFactory.create(PythonWorkerFactory.scala:154)
    at org.apache.spark.SparkEnv.createPythonWorker(SparkEnv.scala:158)
    at org.apache.spark.api.python.BasePythonRunner.compute(PythonRunner.scala:309)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:72)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:374)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:338)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93)
    at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:180)
    at org.apache.spark.scheduler.Task.run(Task.scala:147)
    at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$5(Executor.scala:716)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:86)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:83)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:97)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:719)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.net.SocketTimeoutException: Timed out while waiting for the Python worker to connect back
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:263)
    ... 17 more
26/04/06 16:31:39 WARN TaskSetManager: Lost task 7.0 in stage 0.0 (TID 7) (CHINAMI-G8GC0PN executor driver): org.apache.spark.SparkException: Python worker failed to connect back.
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:281)
    at org.apache.spark.api.python.PythonWorkerFactory.create(PythonWorkerFactory.scala:154)
    at org.apache.spark.SparkEnv.createPythonWorker(SparkEnv.scala:158)
    at org.apache.spark.api.python.BasePythonRunner.compute(PythonRunner.scala:309)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:72)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:374)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:338)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93)
    at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:180)
    at org.apache.spark.scheduler.Task.run(Task.scala:147)
    at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$5(Executor.scala:716)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:86)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:83)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:97)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:719)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.net.SocketTimeoutException: Timed out while waiting for the Python worker to connect back
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:263)
    ... 17 more

26/04/06 16:31:39 ERROR TaskSetManager: Task 7 in stage 0.0 failed 1 times; aborting job
Traceback (most recent call last):
  File "D:\software\Python\Projects\pyecharts\数据处理\flatMap.py", line 8, in <module>
    print(rdd2.collect())
          ~~~~~~~~~~~~^^
  File "D:\software\Python\Projects\pyecharts\.venv\Lib\site-packages\pyspark\core\rdd.py", line 1700, in collect
    sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
  File "D:\software\Python\Projects\pyecharts\.venv\Lib\site-packages\py4j\java_gateway.py", line 1362, in __call__
    return_value = get_return_value(
        answer, self.gateway_client, self.target_id, self.name)
  File "D:\software\Python\Projects\pyecharts\.venv\Lib\site-packages\py4j\protocol.py", line 327, in get_return_value
    raise Py4JJavaError(
        "An error occurred while calling {0}{1}{2}.\n".
        format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 7 in stage 0.0 failed 1 times, most recent failure: Lost task 7.0 in stage 0.0 (TID 7) (CHINAMI-G8GC0PN executor driver): org.apache.spark.SparkException: Python worker failed to connect back.
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:281)
    at org.apache.spark.api.python.PythonWorkerFactory.create(PythonWorkerFactory.scala:154)
    at org.apache.spark.SparkEnv.createPythonWorker(SparkEnv.scala:158)
    at org.apache.spark.api.python.BasePythonRunner.compute(PythonRunner.scala:309)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:72)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:374)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:338)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93)
    at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:180)
    at org.apache.spark.scheduler.Task.run(Task.scala:147)
    at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$5(Executor.scala:716)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:86)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:83)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:97)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:719)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.net.SocketTimeoutException: Timed out while waiting for the Python worker to connect back
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:263)
    ... 17 more

Driver stacktrace:
    at org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$3(DAGScheduler.scala:3122)
    at scala.Option.getOrElse(Option.scala:201)
    at org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2(DAGScheduler.scala:3122)
    at org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2$adapted(DAGScheduler.scala:3114)
    at scala.collection.immutable.List.foreach(List.scala:323)
    at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:3114)
    at org.apache.spark.scheduler.DAGScheduler.$anonfun$handleTaskSetFailed$1(DAGScheduler.scala:1303)
    at org.apache.spark.scheduler.DAGScheduler.$anonfun$handleTaskSetFailed$1$adapted(DAGScheduler.scala:1303)
    at scala.Option.foreach(Option.scala:437)
    at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:1303)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:3397)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:3328)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:3317)
    at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:50)
    at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:1017)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2496)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2517)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2536)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:2561)
    at org.apache.spark.rdd.RDD.$anonfun$collect$1(RDD.scala:1057)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:417)
    at org.apache.spark.rdd.RDD.collect(RDD.scala:1056)
    at org.apache.spark.api.python.PythonRDD$.collectAndServe(PythonRDD.scala:205)
    at org.apache.spark.api.python.PythonRDD.collectAndServe(PythonRDD.scala)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:184)
    at py4j.ClientServerConnection.run(ClientServerConnection.java:108)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.apache.spark.SparkException: Python worker failed to connect back.
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:281)
    at org.apache.spark.api.python.PythonWorkerFactory.create(PythonWorkerFactory.scala:154)
    at org.apache.spark.SparkEnv.createPythonWorker(SparkEnv.scala:158)
    at org.apache.spark.api.python.BasePythonRunner.compute(PythonRunner.scala:309)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:72)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:374)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:338)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93)
    at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:180)
    at org.apache.spark.scheduler.Task.run(Task.scala:147)
    at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$5(Executor.scala:716)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:86)
    at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:83)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:97)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:719)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    ... 1 more
Caused by: java.net.SocketTimeoutException: Timed out while waiting for the Python worker to connect back
    at org.apache.spark.api.python.PythonWorkerFactory.createSimpleWorker(PythonWorkerFactory.scala:263)
    ... 17 more


进程已结束,退出代码为 1


  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-04-06 16:37
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的问题是 在 JDK 17 环境下运行 PySpark 4.1.1 时,出现 Python worker failed to connect back 的错误。这个问题通常与 JDK 版本、PySpark 和 Python 解释器之间的兼容性 有关。


    🔍 问题分析

    1. JDK 17 与 PySpark 的兼容性

    • PySpark 4.1.1 是基于 Spark 3.5.x 的版本,而 Spark 3.5.x 对 JDK 17 的支持并不完全稳定
    • 虽然 JDK 17 是 Java 的长期支持版本,但某些 Spark 版本(尤其是较旧的)可能没有经过充分的测试或修复以确保完全兼容。

    2. Python Worker 连接失败的原因

    • 报错信息:Python worker failed to connect back 表明 Spark 无法连接到 Python 子进程(worker)
    • 可能原因包括:
      • JDK 17 中的某些安全策略或网络配置 导致了连接超时。
      • PySpark 与 Python 解释器之间存在通信问题
      • 防火墙/杀毒软件阻止了本地连接
      • Python 脚本中使用了不兼容的库或语法

    ✅ 建议解决方案

    1. 升级或降级 JDK 版本

    强烈建议使用 JDK 8 或 JDK 11(LTS)以获得更好的 Spark 兼容性

    🧾 操作步骤:

    • 下载并安装 JDK 8JDK 11
    • 设置环境变量 JAVA_HOME 指向新安装的 JDK
    • 重启终端或 IDE,重新运行脚本
    # 设置 JAVA_HOME 示例(Windows)
    set JAVA_HOME="C:\Program Files\Java\jdk-11.0.16"
    

    2. 使用兼容的 PySpark 版本

    虽然你尝试过不同版本,但可以尝试以下推荐版本:

    | PySpark Version | Spark Version | JDK Compatibility | |------------------|----------------|-------------------| | 3.4.1 | 3.4.x | JDK 8 / 11 | | 3.3.3 | 3.3.x | JDK 8 / 11 | | 3.2.2 | 3.2.x | JDK 8 |

    🧾 修改 pip 安装命令:

    pip install pyspark==3.4.1
    

    3. 配置 PySpark 以避免连接超时

    有时,Spark 在启动 Python worker 时会因为超时导致连接失败。可以通过调整配置来解决。

    🧾 修改代码或配置文件:

    from pyspark import SparkConf, SparkContext
    
    conf = SparkConf().setAppName("MyApp")
    conf.set("spark.driver.extraJavaOptions", "-Dio.netty.tryReflectionSetAccessible=true")  # 用于 Netty 兼容
    conf.set("spark.executor.extraJavaOptions", "-Dio.netty.tryReflectionSetAccessible=true")
    
    sc = SparkContext(conf=conf)
    

    4. 检查 Python 脚本是否包含阻塞操作

    如果你的 Python 脚本中有以下内容,可能会导致 Python worker 无法正常启动:

    • 长时间阻塞操作(如 time.sleep()
    • 未处理的异常
    • 未正确关闭的资源

    🧾 修正示例:

    def my_func(x):
        try:
            return x * 2
        except Exception as e:
            print(f"Error: {e}")
            return None
    

    5. 检查防火墙或杀毒软件设置

    有时候,防火墙或杀毒软件会阻止本地回环地址(127.0.0.1)的连接,导致 Python worker 无法连接回来。

    🧾 解决方法:

    • 暂时禁用防火墙或杀毒软件
    • 添加规则允许 sparkpython 相关进程通过

    🛠️ 最终建议列表

    1. 切换为 JDK 8 或 JDK 11,避免使用 JDK 17 与 PySpark 4.1.1 的组合。
    2. 使用兼容的 PySpark 版本(如 3.4.1)。
    3. 修改 Spark 配置,增加额外的 Java 选项,以避免潜在的 Netty 冲突。
    4. 检查 Python 脚本逻辑,避免阻塞或异常导致 worker 无法启动。
    5. 检查系统防火墙或杀毒软件设置,确保不会阻止本地连接。

    📦 附录:推荐配置示例

    ✅ 推荐环境组合

    | 组件 | 版本 | 备注 | |--------------|------------------|---------------------------| | JDK | JDK 8 或 JDK 11 | Spark 3.4.x 支持较好 | | PySpark | 3.4.1 | 与 JDK 8/11 兼容性高 | | Python | 3.8 ~ 3.11 | 与 PySpark 兼容性好 |


    📌 总结

    你的问题是由于 JDK 17 与 PySpark 4.1.1 的兼容性问题导致的。建议优先更换为 JDK 8 或 JDK 11,并使用兼容的 PySpark 版本。

    如果还有其他报错或需要进一步调试,请提供完整的日志和代码片段,我可以帮你更精确地定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 创建了问题 4月6日