PySpark如何通过遍历DataFrame列表公平并行启动作业?
Python中PySpark并行执行DataFrame作业的简洁方案
在PySpark里,即便开启了公平调度模式,用普通for循环串行调用df.show()这类动作时,作业还是会依次启动。要实现类似Scala中.par.foreach的并行效果,可借助Python的concurrent.futures.ThreadPoolExecutor来简洁实现,无需冗余代码:
- 先确保Spark已开启公平调度,配置项:
spark.scheduler.mode=FAIR - 用线程池并行触发DataFrame动作:
from concurrent.futures import ThreadPoolExecutor dfs_list = [df1, df2, df3] dfs_list_with_transformation = [df.transform(...) for df in dfs_list] # 线程池大小设为DataFrame列表长度,并行执行动作 with ThreadPoolExecutor(max_workers=len(dfs_list_with_transformation)) as executor: executor.map(lambda df: df.show(), dfs_list_with_transformation)
原理是Spark的Python API支持在多线程环境下提交作业,线程池会同时触发所有DataFrame的动作调用,配合公平调度模式,Spark会公平分配集群资源,让多个作业并行运行,达到和Scala并行遍历一致的效果。
内容的提问来源于stack exchange,提问作者YFl
相关产品推荐
相关产品推荐

