我正在尝试使用并行方式的函数在python中创建KD树,在Pyspark中使用多处理池,如下所示:
from multiprocessing.dummy import Pool
def func(name):
obj_filter=obj_mod.select("Cord1","Cord2","Cord3").where(col("obj_type")==name)
np_obj_filter=np.array(obj_filter.rdd.map(lambda l: (l[0],l[1],l[2])).collect())
tree=spatial.cKDTree(np_obj_filter,leafsize=16)
with open('/home/tree_'+str(name), 'wb') as f:
pickle.dump(tree, f)
if __name__ == '__main__':
pool = Pool(processes=4)
result = pool.map(func, obj_list_cur)
其中obj_list_cur是一个类似['obj1','obj2','obj3']
obj_mod是一个包含3个坐标的pyspark数据框
似乎所有这一切都在一个节点上运行,因为运行时间几乎与for循环相同(以串行方式)。
我尝试根据此链接设置--conf SparkSession.builder.master=yarn
:
Distribute Multiprocessing Pool to Spark Workers
但它没有帮助。如何让这个过程利用我的所有节点。
我可以在阶段方面看到一些并行化(在parllel中执行多个阶段,我不会看到for循环):
[Stage 7:==>(29 + 1) / 30][Stage 12:=>(29 + 1) / 30][Stage 17:=>(29 + 1) / 30]