如何在火花中分配任务

时间:2016-06-09 22:18:47

标签: apache-spark distributed-system

我试图理解当一个作业是从spark-submit提交的时候,我已经用4个节点激发部署的系统,那么工作如何在spark中分配。如果有大型数据集要进行操作,我想准确理解任务分为多少个阶段以及为该工作运行多少个执行程序。想要了解每个阶段的决定如何。

1 个答案:

答案 0 :(得分:1)

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

阶段的数量仅取决于所描述的工作流程,其中包括不同类型的地图,缩小,连接等。如果你理解它,你基本上可以从代码中读取。但最重要的是,它可以帮助您编写更高性能的算法,因为人们通常知道必须避免混乱。例如,当你进行连接时,它需要随机播放 - 它是一个边界阶段。这很简单,你必须打印rdd.toDebugString(),然后查看缩进(看here),因为缩进是一种随机播放。

但是执行者的数量完全不同,因为它取决于分区的数量。它类似于2个分区,它只需要2个执行器,但是对于40个分区 - 所有4个,因为你只有4个。但是额外的分区数量可能取决于你可以在spark-submit提供的几个属性:

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

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