Apache spark spark中的任务是如何分配的

Apache spark spark中的任务是如何分配的,apache-spark,distributed-system,Apache Spark,Distributed System,我试图理解,当从spark submit提交作业时,spark部署了具有4个节点的系统,工作是如何在spark中分布的。如果有大型数据集要操作,我想确切地了解任务划分了多少阶段,以及有多少执行者为任务运行。想了解每个阶段是如何决定的 很难准确回答这个问题,因为有很多不确定性 阶段的数量仅取决于所描述的工作流,其中包括不同类型的映射、减少、连接等。如果您理解它,基本上可以从代码中正确地阅读它。但最重要的是,这有助于编写更高性能的算法,因为众所周知,算法必须避免混乱。例如,当你加入时,它需要洗牌-这

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

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

阶段的数量仅取决于所描述的工作流,其中包括不同类型的映射、减少、连接等。如果您理解它,基本上可以从代码中正确地阅读它。但最重要的是,这有助于编写更高性能的算法,因为众所周知,算法必须避免混乱。例如,当你加入时,它需要洗牌-这是一个边界阶段。这很容易理解,您必须打印
rdd.toDebugString()
,然后查看缩进(look),因为缩进是一个随机过程

但对于执行器的数量,情况完全不同,因为它取决于分区的数量。就像对于2个分区,它只需要2个执行器,但是对于40个分区,全部4个,因为您只有4个。但另外,分区的数量可能取决于spark submit上可以提供的几个属性:

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

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

应用程序在Spark上运行的大部分方式都可以在Spark submit的命令行中进行配置,其中包括执行器、节点等的数量: