【问题标题】:Execute multiple Spark jobs执行多个 Spark 作业
【发布时间】:2019-11-19 18:50:10
【问题描述】:

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

【问题讨论】:

  • 可能是资源不够 3 个作业。尝试将executor-cores 减为 1,看看是否有效。
  • 你是在部署模式下运行它 --> 客户端模式吗?
  • @syadav - 是的,我在客户端模式下运行它

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


【解决方案1】:

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

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

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

【讨论】:

  • 如果部署模式是客户端,那么你的解释有点合适,如果它的集群模式,那么它的其他东西。
  • 似乎部分正确。我使用以下配置为主节点增加了 6 个核心。 --master yarn --num-executors 1 --executor-cores 1 --executor-memory 2G 现在正在接受 3 个工作。
猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多