配置Spark ThriftServer与Spark Connect Server实现同时运行
解决Spark单节点同时运行ThriftServer和Spark Connect的配置问题
问题根源
你的spark-env.sh中executor资源配置总和远超虚拟机可用核心:
- 虚拟机总可用核心:
SPARK_WORKER_CORES=4 - 配置的executor总核心:
SPARK_EXECUTOR_INSTANCES=4 × SPARK_EXECUTOR_CORES=2 = 8
启动任意一个服务时,Spark会尝试申请远超实际的资源,直接耗尽worker节点的所有核心,导致另一个服务因无法获取资源陷入等待。
配置调整方案
1. 修改全局spark-env.sh配置
调整executor参数,让总核心数不超过worker的可用核心,同时预留资源给两个服务共享:
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-21.0.7.0.6-1.portable.jdk.x86_64 export SPARK_MASTER_HOST=192.168.2.5 export SPARK_MASTER_PORT=7077 export SPARK_MASTER_URL=spark://$SPARK_MASTER_HOST:$SPARK_MASTER_PORT export SPARK_WORKER_CORES=4 export SPARK_WORKER_MEMORY=4g # 方案1:单executor占用3核,留1核给服务调度 export SPARK_EXECUTOR_INSTANCES=1 export SPARK_EXECUTOR_CORES=3 # 方案2:双executor各占1核,总核心2,剩余2核给另一个服务 # export SPARK_EXECUTOR_INSTANCES=2 # export SPARK_EXECUTOR_CORES=1
2. 启动服务时单独指定资源(无需修改全局配置)
如果不想改动全局配置,可以在启动每个服务时单独限制资源,避免冲突:
- 启动ThriftServer:
./sbin/start-thriftserver.sh --executor-cores 2 --executor-memory 2g --total-executor-cores 2
- 启动Spark Connect:
./sbin/start-connect-server.sh --executor-cores 2 --executor-memory 2g --total-executor-cores 2
两个服务各占用2核,刚好匹配虚拟机4核资源,内存也各分配2g,不超过worker总内存。
额外检查项
- 启动两个服务前,先确保Spark Master和Worker已启动:
./sbin/start-all.sh - 通过Spark Web UI(默认端口8080)查看资源使用情况,确认两个服务均成功获取到分配的资源。
内容的提问来源于stack exchange,提问作者Ziggy
相关产品推荐
相关产品推荐

