Pyspark的多处理池

时间:2018-06-18 11:07:32

标签: apache-spark parallel-processing pyspark multiprocessing distributed-computing

我正在尝试使用并行方式的函数在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=yarnDistribute Multiprocessing Pool to Spark Workers

但它没有帮助。如何让这个过程利用我的所有节点。

我可以在阶段方面看到一些并行化(在parllel中执行多个阶段,我不会看到for循环):

[Stage 7:==>(29 + 1) / 30][Stage 12:=>(29 + 1) / 30][Stage 17:=>(29 + 1) / 30]

0 个答案:

没有答案