繁体   English   中英

执行多个 Spark 作业

[英]Execute multiple Spark jobs

我正在运行具有以下集群和应用程序配置的 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 Session 代码:

val spark: SparkSession = {
  val sparkSession = SparkSession
    .builder()
    .appName("Data Analytics")
    .config("spark.scheduler.mode", "FAIR")
    //.master("local[*]")
    .getOrCreate()
  sparkSession
}

我的进一步问题是:为什么 SparkSession 为每个作业创建 SparkUI 以及我们如何解决这个问题。 有没有办法将相同的 Session 用于多个工作。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM