[英]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.