分区是预分配给执行程序还是动态分配的?

时间:2017-09-04 10:37:39

标签: apache-spark

在调用foreachPartitions / mapPartitions时,有两种可能的分配策略:

  1. 将所有分区预先分配给不同的执行程序,即如果我有1000个分区和10个执行程序,那么每个执行程序都会获得100个分区。
  2. 每当执行程序准备就绪时,为其分配一个新分区,即,如果某些分区运行缓慢,执行程序可能会获得更少的分区,而其他分区会获得更多分区。
  3. spark实际使用了哪种策略?

1 个答案:

答案 0 :(得分:0)

这个问题没有简单的答案。执行程序的确切分配取决于集群管理器(独立,YARN,Mesos等)以及配置选项的数量,其中一些方法不适用于所有管理器:

  • spark.deploy.spreadOut - 循环或整合到最少数量的节点。
  • spark.dynamicAllocation.enabled - 根据工作量启用分配。
  • spark.speculation - 为慢任务启用推测执行。

这可能会受到数据局部性(进一步受spark.locality.wait影响)和运行时事件(失败,超时)和应用程序特定参数(如首选位置)和DAG /执行计划(在某些情况下Spark将会影响)的影响更喜欢分区的共址。