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任务管理与执行逻辑的标准设计:
- 父pyspark.daemon(进程242279):作为管理守护进程,核心职责是与Java Executor进程维持通信,接收Executor下发的Python任务请求,同时负责子daemon进程的生命周期管理——包括根据任务需求fork子进程、监控子进程状态、回收闲置进程等。它本身不执行具体Python业务代码,仅做调度和通信中转。
- 子pyspark.daemon(进程242594):作为任务执行进程,专门运行具体Python代码,比如UDF、Python RDD操作、Pandas UDF等。当有Python任务到达时,父daemon会fork出子进程处理任务,这种设计的优势在于:
- 隔离执行环境,单个任务崩溃不会影响父daemon与Executor的通信链路;
- 支持并发扩展,多Python任务并行时可创建多个子进程处理;
- 复用资源,任务完成后子进程可保留用于后续任务,减少进程创建开销。
这种分层设计保证了PySpark中Java与Python交互的稳定性和执行效率,是PySpark Python执行架构的常规实现。
内容的提问来源于stack exchange,提问作者BruceSun
相关产品推荐
相关产品推荐

