我们使用spark(使用版本2.1)shell同时运行多个作业。从过去几天开始,我们一直在收到错误:
失败:org.spark-project.jetty.server.Server@5552479:java.net.BindException:已在使用的地址
在阅读了几个堆栈溢出后,我发现默认情况下,我发现火花首次尝试使用Spark UI的端口4040,如果失败则尝试+1端口。
根据this stack overflow post和spark documentation我们可以提供spark.port.maxRetries
配置,默认设置为16,但
此属性是否适用于spark.ui.port
或其spark.driver.port
的唯一申请?
spark如何决定哪个端口需要用于执行程序?并且假设我有一个使用20个执行器的工作,那么spark如何决定哪些端口用于那些执行器?我们可以控制吗?
答案 0 :(得分:1)
maxRetries仅适用于驱动程序。初始化sparkContext时,它从spark.driver.port中指定的那个开始,然后通过将端口递增1来退出maxRetires时间。此端口对集群管理器分配的所有执行程序可见。因此,如果maxRetires为16,并且已经启动了16个SparkContext,则不会初始化新的sparkContext,直到其中一个退出。 Cluster Manager负责获取所需的资源以获取执行程序,我认为我们无法控制它获取的端口。只要执行程序能够在初始化它的端口上与驱动程序进行通信,就不会有问题。