限制单个RDD的最大并行度而不减少分区数

时间:2017-02-27 18:01:29

标签: apache-spark

是否可以在不更改实际分区数的情况下限制RDD级别的最大并发任务数?用例是在不减少分区数量的情况下,不会使具有太多并发连接的数据库瘫痪。减少分区数会导致每个分区变大并最终无法管理。

3 个答案:

答案 0 :(得分:0)

Spark中分区的主要意义在于提供并行性,您的要求是降低并行性!但要求是真正的:)

分区数量少的真正问题是什么?是否一次写入太多数据会产生问题?如果是这种情况,您可以分解每个分区的写作。

您可以将数据放入某个中间队列并以受控方式处理吗?

答案 1 :(得分:0)

一种方法可能是启用动态分配,并将执行器的最大数量设置为所需的最大并行度。

spark.dynamicAllocation.enabled true
spark.dynamicAllocation.maxExecutors <maximum>

您可以在此处阅读有关配置动态分配的更多信息:

https://spark.apache.org/docs/latest/job-scheduling.html#dynamic-resource-allocation https://spark.apache.org/docs/latest/configuration.html#scheduling

如果您试图控制一个特定的计算,您可以尝试以编程方式控制执行程序的数量:

https://github.com/jaceklaskowski/mastering-apache-spark-book/blob/master/spark-sparkcontext.adoc#dynamic-allocation

答案 2 :(得分:0)

我将此作为“回答”重新发布,因为我认为它可能是最不脏的黑客,可能会得到你想要的行为:

使用mapPartitions(...)调用,并在映射函数的开头,对全局可查看状态(可能是REST调用?)进行某种阻塞检查,只允许一些最大数量的检查成功在任何给定的时间。由于这将延迟完整的RDD操作,您可能需要增加RDD完成的超时以防止错误