spark中任务是如何分配的

How is task distributed in spark

我试图了解当从 spark-submit 提交作业时,我已经部署了具有 4 个节点的 spark 系统,spark 中的工作是如何分布的。如果有大数据集要操作,我想确切地了解任务分为多少个阶段以及作业有多少个执行者运行。想了解每个阶段是如何决定的。

这个问题很难准确回答,因为有很多不确定因素。

阶段的数量仅取决于所描述的工作流程,其中包括不同类型的映射、缩减、连接等。如果你理解它,你基本上可以直接从代码中阅读。但最重要的是,这可以帮助您编写性能更高的算法,因为众所周知,算法必须避免混洗。例如,当您进行连接时,它需要洗牌——这是一个边界阶段。这个看起来很简单,你要打印rdd.toDebugString()然后看缩进(看),因为缩进是一个shuffle.

但是执行者的数量就完全不同了,因为它取决于分区的数量。这就像 2 个分区只需要 2 个执行程序,但是对于 40 个分区 - 所有 4 个,因为你只有 4 个。但是另外分区的数量可能取决于你可以在 spark-submit 中提供的几个属性:

  • spark.default.parallelism 参数或
  • 您使用的数据源(f.e。HDFS 和 Cassandra 不同)

让集群中的所有核心保持忙碌是件好事,但不要再忙了(意味着单个进程只处理一个分区),因为每个分区的处理都需要一些开销。另一方面,如果您的数据是倾斜的,那么某些核心将需要比其他核心更多的时间来处理更大的分区 - 在这种情况下,它有助于将数据拆分到更多分区,以便所有核心都忙于大致相同的时间。这有助于同时平衡集群和吞吐量。