PySpark运行因SparkUI端口绑定失败报错,如何固定使用同一端口?
报错根因
java.net.BindException: Failed to bind to /0.0.0.0:4056: Service 'SparkUI' failed after 16 retries (starting from 4040)! Consider explicitly setting the appropriate port for the service 'SparkUI' (for example spark.ui.port for SparkUI) to an available port or increasing spark.port.maxRetries.
这个报错是因为前一次运行的PySpark进程没有正常终止,持续占用SparkUI默认使用的4040端口,新启动的进程连续尝试16个端口都绑定失败导致的。
固定端口的解决方案
方法一:显式配置固定SparkUI端口
在初始化SparkSession时指定spark.ui.port参数为你想要固定的端口即可,示例代码如下:
from pyspark.sql import SparkSession # 初始化Spark时指定固定端口 spark = SparkSession.builder \ .appName("本地CSV写入任务") \ .config("spark.ui.port", "4040") \ .getOrCreate() # 此处写你的业务逻辑代码 # 任务结束后主动停止Spark,释放端口 spark.stop()
*注意:固定端口后要保证每次运行前该端口没有被其他进程占用,否则还是会绑定失败。
方法二:无需使用SparkUI可直接关闭
如果你不需要用到SparkUI监控任务运行状态,可以直接关闭SparkUI,完全避免端口绑定问题:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("本地CSV写入任务") \ .config("spark.ui.enabled", "false") \ .getOrCreate() # 业务逻辑代码 spark.stop()
端口被占用的临时处理方法
如果出现端口被残留进程占用的情况,可以手动清理残留进程释放端口:
- Windows:打开任务管理器,结束所有Java/Spark相关的进程即可
- Mac/Linux:执行命令
lsof -i:4040查询占用4040端口的进程PID,再执行kill -9 对应PID即可释放端口
内容的提问来源于stack exchange,提问作者Data girl
相关产品推荐
相关产品推荐

