我想控制Spark RDD中每个阶段正在处理的并发分区数。 .repartition(...)
不是解决方案,因为它只修改了一个阶段中的分区总数,而不是正在处理的分区数。
通常,您可以使用--executor-cores
和--num-executors
参数在一开始就限制并发分区的数量。这并不准确,因为处理阶段可以交错等等。
我想要完成的主要事情是来自具有某些资源限制(并发连接)的数据库的dataload进程 - 但我不希望这些数据库资源限制决定我的其他Spark进程或RDD的并发性。我也不想在流程开始时强制使用非常大的分区,这些分区必须进一步拆分和重新分配。
期待这似乎是一件合理的事情,但乍一看不是Spark API中可以实现的东西。
示例(一些伪代码)
rdd = pseudoReadFromJDBC(partitions = 500,parallelism=10)
.repartition(100)
.parallelism(50)
.operatorOnRDD();
所以在这种情况下,在第一阶段,我会将从500个查询中检索到的数据拆分为500个较小的数据集。但是,我会限制Spark只允许同时运行它的10个线程,所以我最多只能同时打开10个JDBC连接。其他分区只会排队。
然后在第二阶段,我可能会重新分区,但更重要的是,我想选择更高程度的实际并行性,因为我不再受数据库限制,允许有限数量的同时连接。
这就是我在每个阶段改变它的意思。
答案 0 :(得分:0)
有一个参数spark.default.parallelism。您可以尝试更改此值。