我正在使用以下集群和应用程序配置运行Spark作业:
总节点数:3
Master Node Memory 7.5GB, 2 Cores
Worker Node1, Memory 15GB, 4 Cores
Worker Node2, Memory 15GB, 4 Cores
应用程序配置:
--master yarn --num-executors 2 --executor-cores 2 --executor-memory 2G
我正在尝试与同一用户同时提交多个作业,但是我看到只有前两个提交的作业正在执行,而第三个则必须等待随后的交战。
19/11/19 08:30:49 WARN org.apache.spark.util.Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
19/11/19 08:30:49 WARN org.apache.spark.util.Utils: Service 'SparkUI' could not bind on port 4041. Attempting port 4042.
我发现正在为每个提交的作业创建SparkUI,并且我的集群一次仅接受两个作业。此外,我观察到,一旦首次提交的作业完成了执行,它便在端口4042上接收了第三份作业。我的集群一次只接受两个工作,这可能是什么问题?
这是我的Spark会话代码:
val spark: SparkSession = {
val sparkSession = SparkSession
.builder()
.appName("Data Analytics")
.config("spark.scheduler.mode", "FAIR")
//.master("local[*]")
.getOrCreate()
sparkSession
}
我的进一步问题是: 为什么SparkSession为每个作业创建SparkUI以及我们如何解决此问题。 有什么办法可以将同一会话用于多个作业。
答案 0 :(得分:1)
您需要考虑以下几件事:执行spark-submit后,将创建一个Spark应用程序(客户端模式),并创建一个新的驱动程序,并使用该端口将新端口用于驱动程序控制台4040。这是发出警告的原因,因为您正在尝试创建另一个应用程序和另一个驱动程序,但是端口4040已被使用,因此它尝试使用4041。Spark作业不是Spark Application,是一个执行对应于一个Spark动作,因此取决于程序执行的动作数,这些动作将产生。
在您的情况下,您尝试创建两个具有两个内核的执行程序,换句话说,您正在尝试创建两个具有两个内核的JVM(驱动程序除外)。由于使用的是Yarn,它将尝试为每个应用程序提供4个内核,为每个驱动程序提供一个。
有关更多信息,请检查此链接: https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-scheduler-ActiveJob.html