【发布时间】:2019-12-04 19:09:00
【问题描述】:
我的问题是关于 Spark 中 Stage 中的任务顺序。
上下文:
我有一个 Spark 数据帧,分为 3000 个分区。分区是在一个特定的键上完成的。我使用mapPartitionsWithIndex 来获取分区的id 及其包含的元素数量。例如:
df.rdd
.mapPartitionsWithIndex((i,rows) => Iterator((i,rows.size)))
.toDF("id", "numElements")
当 Spark 在我的数据帧上运行计算时,我在 Spark UI 中看到(我也做了一些测试以确保是这种情况)任务index 对应于分区id,与@987654326 完全相同@ 使用上面的mapPartitionsWithIndex 获得。因此,任务是按照给定执行程序上增加分区的id 的顺序执行的。
我发现分区中的行数与任务的执行时间之间存在明显的相关性。由于我的数据集具有无法更改的倾斜性质,我有几个分区的元素数量(> 8000)比平均数量(〜3000)要多得多。平均分区的执行时间为 10-20 分钟,较大的可以超过 3 小时。我的一些最大的分区有很高的id,因此相应的任务几乎在一个阶段结束时执行。因此,其中一个 Spark Stage 在最后 5 个任务上挂起 3 小时。
问题:
有没有办法对分区的id 重新排序,以便首先执行来自最大分区的任务?或者等效地,有没有办法改变任务的执行顺序?
注意:
- 我不需要将分区移动到其他节点或执行器,只需更改执行顺序即可。
- 无法更改分区键
- 我可以更改分区数,但问题仍然存在
我的设置:使用 Spark-submit 运行 Mesos 的 Spark 2.2。该作业在 60 个 CPU 上运行,有 12 个执行程序,每个执行程序有 5 个 CPU。
【问题讨论】:
-
你找到证明我错的方法了吗?如果不同分区上的数据依赖关系没有问题,您可以对密钥进行加盐。
-
@bluephantom 还没有,但我希望有人能提供比“不,没有。如果是这样,它现在应该在文档中。”
-
但有时这就是简单的答案。我与 Informatica 进行了比较,结果不同。
-
你知道卡尔萨根的名言吗:没有证据不是没有证据。仅仅因为它不在文档中并不意味着它不可能。
-
可悲的是,引用卡尔萨根的话的人似乎并不知道他所说的具体情况或他所指的具体情况。他们显然甚至没有意识到萨根实际上是在引用宇宙学家马丁里斯经常说的“格言”。
标签: scala apache-spark apache-spark-sql partitioning