apache-spark - spark中任务是如何分配的

标签 apache-spark distributed-system

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

最佳答案

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

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

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

  • spark.default.parallelism 参数或
  • 您使用的数据源(例如 HDFS 和 Cassandra 是不同的)

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

关于apache-spark - spark中任务是如何分配的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37737110/

相关文章:

scala - 将键/值对列表转换为 spark 中每个键的值列表

scala - Spark 卡在删除广播变量(可能)

java - 本地类不兼容异常 : when running spark standalone from IDE

rest - YARN集群模式下的Spark监控REST API

sockets - 创建多个 ZeroMQ 套接字的开销是多少?

machine-learning - 为什么spark.ml不实现任何spark.mllib算法?

algorithm - Lamport 的 Paxos 中的矛盾使简单的论文

java - Zipkin - 是否有关于在 Java 中创建跨度和跟踪的更多信息

parallel-processing - 如何在 Erlang 中实现以下循环?

locking - ZooKeeper 和 RabbitMQ/Qpid 结合在一起——是杀伤力大还是一个好的组合?