当启动一个pyspark程序时,在worker节点中,来自
ps -uxf
的进程树如下所示(我简化了java参数等)
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://[email protected]: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个进程的理解,我不太确定为什么有两个pyspark.daemon进程,有人可以分享更多关于这个的信息吗?
我想我从源代码的注释中找到了答案这里:
// 因为从 Java 分叉进程的成本很高,所以我们更喜欢启动单个 Python 守护进程, // pyspark/daemon.py(默认情况下)并告诉它为我们的任务分叉新的工作人员。这个守护进程 // 目前仅适用于基于 UNIX 的系统,因为它使用信号进行子管理, // 所以我们也可以直接启动worker pyspark/worker.py(默认情况下)。