Spark:为什么执行由主节点而不是工作节点执行?

时间:2021-07-12 09:32:39

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

我有一个由一个主节点和两个工作节点组成的 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()

这是预期的行为吗?

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

1 个答案:

答案 0 :(得分:1)

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

<块引用>

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

...

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

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