首页 > 解决方案 > 执行多个 Spark 作业

问题描述

我正在运行具有以下集群和应用程序配置的 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 以及我们如何解决这个问题。有没有办法将同一个会话用于多个工作。

标签: scalaapache-sparkapache-spark-sqlapache-spark-2.3

解决方案


您必须考虑几件事:执行 spark-submit 后,将创建一个 Spark 应用程序(客户端模式)并创建一个新驱动程序,并使用端口 4040 为驱动程序控制台使用一个新端口。那这是警告的原因,因为您正在尝试创建另一个应用程序和另一个驱动程序,但端口 4040 已被使用,因此它尝试使用 4041。Spark 作业不是 Spark 应用程序,是对应于的执行一个 Spark 动作,因此取决于您的程序执行的动作数量,将产生的作业数量。

在您的情况下,您正在尝试创建两个具有两个内核的执行程序,换句话说,您正在尝试创建两个每个具有两个内核的 JVM,除了驱动程序。因为您使用的是 Yarn,它会尝试为您的每个应用程序提供 4 个内核,并为每个驱动程序提供一个内核。

有关更多信息,请查看此链接: https ://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-scheduler-ActiveJob.html


推荐阅读