来自pyspark的数据集上的多处理返回JVM错误

时间:2019-04-02 04:32:14

标签: pandas pyspark python-multiprocessing

我需要在Jupyter Notebook中并行运行一些聚类算法。在执行多线程或单独运行时,我要并行执行的聚类功能有效。但是,它返回

  

提高Py4JError(“ {0}在JVM中不存在” .format(name))

当我尝试多处理时。我在多处理方面没有太多经验,我可能做错了什么?

集群代码:

def clustering(ID, df):
    pandas_df = df.select("row", "features", "type") \
    .where(df.type == ID).toPandas()

    print("process " + str(ID) + ": preparing data for clustering")
    feature_series = pandas_df["features"].apply(lambda x: x.toArray())
    objs = [pandas_df, pd.DataFrame(feature_series.tolist())]
    t_df = pd.concat(objs, axis=1)

    print("process " + str(ID) + ": initiating clustering")
    c= #clustering algo here
    print("process " + str(ID) + " DONE!")

    return

用于多处理的代码:

import multiprocessing as mp

k = 4

if __name__ == '__main__':
    pl = []
    for i in range(0,k):
        print("sending process:", i)
        process = mp.Process(target=clustering, args=(i, df))
        jobs.append(process)
        process.start()

    for process in pl:
        print("waiting for join from process")
        process.join()

1 个答案:

答案 0 :(得分:0)

错误是由子进程无法访问相同的内存(pyspark数据帧所在的内存)引起的。

通过将对pyspark数据框的访问权放入另一个函数中来解决,首先对数据集进行分区,例如:

    pandas_df = df.select("row", "features", "type") \
    .where(df.type == ID).toPandas()

然后在分离的Pandas数据帧上运行聚类。