Spark 2.1 UI端口重试次数、端口配置及Executor端口管控咨询
针对你遇到的Spark UI端口绑定问题,以及三个疑问,我来逐一解答:
问题1:若4041端口也不可用,Spark会重试多少次?
Spark从默认的4040端口开始尝试绑定,每失败一次就自动尝试下一个+1的端口,重试的总次数由spark.port.maxRetries配置决定,默认值是16次。也就是说,它最多会尝试从4040到4056这17个连续端口(包含初始的4040),如果所有这些端口都被占用,就会抛出你遇到的BindException。
问题2:默认值为16的spark.port.maxRetries配置是否适用于spark.ui.port,还是仅适用于spark.driver.port?
这个配置是全局通用的,并非只针对spark.driver.port,它适用于所有Spark组件需要自动重试绑定的端口场景——包括spark.ui.port、spark.driver.port,以及Executor相关的spark.executor.port等。只要是Spark需要自动寻找可用端口的场景,都会遵循这个重试次数限制。
问题3:Spark如何决定Executor使用的端口?当任务使用20个Executor时,端口如何分配?能否进行管控?
在Spark 2.1版本中,相关逻辑和管控方式如下:
- 默认端口分配逻辑:Executor的端口默认由操作系统随机分配——因为
spark.executor.port的默认值是0,这会让操作系统自动挑选当前可用的空闲端口。当你启动20个Executor时,每个Executor启动时都会独立向OS请求一个空闲端口,OS会保证这些端口互不冲突,所以不需要你手动干预分配。 - 端口管控方式:
- 如果你想指定固定端口,可以设置
spark.executor.port为一个具体的端口号。此时每个Executor会先尝试绑定这个端口,如果被占用,就按照spark.port.maxRetries的配置,依次尝试+1的端口,直到找到可用的。不过这种方式如果Executor数量较多(比如20个),可能会因为端口池不足导致部分Executor启动失败,需要谨慎使用。 - 遗憾的是,Spark 2.1版本还没有引入
spark.executor.portRange配置(这个参数在Spark 2.3及以后版本才添加),所以无法直接通过Spark配置限制Executor使用的端口范围。如果有这个需求,只能通过操作系统层面的手段实现,比如在Linux系统上用sysctl调整可用端口范围,或者用防火墙规则限制Spark进程可使用的端口。
- 如果你想指定固定端口,可以设置
内容的提问来源于stack exchange,提问作者Explorer
相关产品推荐
相关产品推荐

