执行多个Spark作业

时间:2019-11-19 09:11:55

标签: scala apache-spark apache-spark-sql apache-spark-2.3

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

1 个答案:

答案 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