You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark Worker节点为何存在两个pyspark.daemon进程?

为什么PySpark Worker节点会出现两个pyspark.daemon进程?

启动PySpark程序后,Worker节点通过ps -uxf得到的简化进程树如下:

bob     241057  2.1  0.0 3380232 383300 ?      Sl   22:47   0:11 /third_party/java/jdk/1.8.0_72/bin/java org.apache.spark.deploy.worker.Worker --webui-port 8081 ubuntu_1:56014 -c 1 -m 11G
bob     241882 36.6  0.1 3264692 535552 ?      Sl   22:48   3:22  \_ /third_party/java/jdk/1.8.0_72/bin/java -Dspark.driver.port=42857--driver-url spark://CoarseGrainedScheduler@ubuntu_1:42857 --executor-id 0 --hostname 198.18.5.4 --cores 1 --app-id app-20241217224629-0000 --worker-url spark://Worker@198.18.5.4:39995 --resourceProfileId 0
bob     242279  0.3  0.0 179724 38512 ?        S    22:48   0:01      \_ /third_party/python3/bin/python3.8.bin -m pyspark.daemon
bob     242594 97.9  0.0 184844 33860 ?        S    22:48   8:54          \_ /third_party/python3/bin/python3.8.bin -m pyspark.daemon

我对这4个进程的理解如下:

  • 进程241057:Worker进程,负责与Spark Master通信,监控并上报资源可用性,根据Master指令启动Executor,同时监控Executor的存活状态与资源消耗;
  • 进程241882:Executor进程,负责执行应用的实际计算与数据处理;
  • 进程242279:pyspark.daemon进程,负责与Executor进程通信;
  • 进程242594:另一个pyspark.daemon进程,负责运行UDF等Python相关实际任务。

疑问:不确定为何会存在两个pyspark.daemon进程,恳请解惑。


解答

这是PySpark为隔离Python任务管理与执行逻辑的标准设计:

  1. 父pyspark.daemon(进程242279):作为管理守护进程,核心职责是与Java Executor进程维持通信,接收Executor下发的Python任务请求,同时负责子daemon进程的生命周期管理——包括根据任务需求fork子进程、监控子进程状态、回收闲置进程等。它本身不执行具体Python业务代码,仅做调度和通信中转。
  2. 子pyspark.daemon(进程242594):作为任务执行进程,专门运行具体Python代码,比如UDF、Python RDD操作、Pandas UDF等。当有Python任务到达时,父daemon会fork出子进程处理任务,这种设计的优势在于:
    • 隔离执行环境,单个任务崩溃不会影响父daemon与Executor的通信链路;
    • 支持并发扩展,多Python任务并行时可创建多个子进程处理;
    • 复用资源,任务完成后子进程可保留用于后续任务,减少进程创建开销。

这种分层设计保证了PySpark中Java与Python交互的稳定性和执行效率,是PySpark Python执行架构的常规实现。

内容的提问来源于stack exchange,提问作者BruceSun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:50:11