【问题标题】:Spark: Why execution is carried by a master node but not worker nodes?Spark:为什么执行由主节点而不是工作节点执行?
【发布时间】:2021-07-12 09:32:39
【问题描述】:

我有一个由一个主节点和两个工作节点组成的 spark 集群。

当执行以下代码从数据库中提取数据时,实际执行是由 master 而不是其中一个 worker 执行的。

    sparkSession.read
      .format("jdbc")
      .option("url", jdbcURL)
      .option("user", user)
      .option("query", query)
      .option("driver", driverClass)
      .option("fetchsize", fetchsize)
      .option("numPartitions", numPartitions)
      .option("queryTimeout", queryTimeout)
      .options(options)
      .load()

这是预期的行为吗?

有什么方法可以禁用这种行为吗?

【问题讨论】:

  • 它应该在工作节点上运行,除非在主节点本身上创建了一个执行器。当您运行其他一般火花操作(如 groupBy/count 等)时,会有什么行为?您是否对两者进行了监控和比较?
  • 您是如何创建 Spark 会话的(以及它的配置是什么)?您如何检查工作是在主节点还是工作节点上进行?
  • @Sanket9394 什么情况下执行器是在主节点上创建的?

标签: scala apache-spark google-cloud-dataproc


【解决方案1】:

Spark 应用程序有两种类型的运行器:驱动程序和执行程序,以及两种类型的操作:转换和操作。据此doc

RDD 支持两种类型的操作:转换(从现有数据集创建新数据集)和操作(在对数据集运行计算后将值返回给驱动程序)。例如,map 是一种转换,它通过一个函数传递每个数据集元素并返回一个表示结果的新 RDD。另一方面,reduce 是一个动作,它使用某个函数聚合 RDD 的所有元素并将最终结果返回给驱动程序(尽管也有一个并行的 reduceByKey,它返回一个分布式数据集)。

...

Spark 中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记得应用于某些基础数据集(例如文件)的转换。仅当操作需要将结果返回给驱动程序时才计算转换。这种设计使 Spark 能够更高效地运行。例如,我们可以意识到通过 map 创建的数据集将在 reduce 中使用,并且仅将 reduce 的结果返回给驱动程序,而不是更大的映射数据集。

所以在 Spark 应用程序中,一些操作在执行器中执行,一些操作在驱动程序中执行。在 Dataproc 上,执行程序始终位于工作节点上的 YARN 容器中。但驱动程序可能位于主节点或工作节点上。默认称为“客户端模式”,这意味着驱动程序在 YARN 之外的主节点上运行。但是您可以使用gcloud dataproc jobs submit spark ... --properties spark.submit.deployMode=cluster 启用“集群模式”,这将在工作节点上的 YARN 容器中运行驱动程序。有关详细信息,请参阅此doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多