运行比核心数量更多的分区是不是有意义?

Posted

技术标签:

【中文标题】运行比核心数量更多的分区是不是有意义?【英文标题】:Does it ever make sense to run more partitions than number of cores?运行比核心数量更多的分区是否有意义? 【发布时间】:2017-02-16 20:58:28 【问题描述】:

考虑到 Spark 任务的数量不能高于核心数量,运行更多的分区是否有意义?如果有,能否详细说明?

【问题讨论】:

【参考方案1】: 正如您提到的,您需要至少有 1 个任务/核心才能利用所有集群的资源。 根据每个阶段/任务所需的处理类型,您可能会遇到处理/数据倾斜 - 可以通过使分区更小/更多的分区以某种方式缓解这种情况,从而更好地利用集群(例如,当执行器运行更长的时间时)需要 5 分钟的任务,其他执行者可以运行 10 个 30 秒的较短任务)。

可能存在您想要增加分区数量的其他情况(例如,如果您达到大小/内存限制)。

查看这篇关于并行调优的精彩文章:http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/

更新: 这如何帮助处理/数据倾斜并为您提供更好的集群利用率和更快的作业执行(下面的 Spark UI 示例屏幕截图,您可以在其中看到任务之间的偏差 - 请参阅差异中值与最大任务持续时间):

假设您有一个可以并行运行 2 个任务的集群。

使用 1 个任务(1 个空闲核心)处理数据需要 60 分钟 - 作业需要 60m。 如果将其拆分为 2,您可能会发现因为倾斜:Task1:45m,Task-2:15m。作业需要 45m(对于 30m,你有 1 个空闲核心)。 如果你把它分成 4 个,你可能会得到:Task1:30m,Task-2:10m,Task-3:10m,Task-4:10m。作业需要 30m(第一个核心运行 1 个任务 30m,而另一个运行其他 3 个较小的任务,每个 10m)。 等

【讨论】:

只是为了确保我理解关于数据倾斜的观点:如果我有一个数据集比其他分区更大的分区,那么将其分成更小的分区会更有效,以便其他执行程序和任务可以并行处理它,而不是等待一个任务处理大分区。我没听错吗?

以上是关于运行比核心数量更多的分区是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章

运行一百万次扫描的 hbase mapreduce 作业是不是有意义?

在 GPU 上运行操作系统内核级计算是不是有意义?

索引日期类型的核心数据属性是不是有意义?

缩小 NodeJS 中使用的代码是不是有意义?

使用 JSLint 并遵循它是不是有意义? [关闭]

在 alter table drop column 之后优化表是不是有意义?