Python 使用spark进行多处理(PySpark)

Python 使用spark进行多处理(PySpark),python,apache-spark,pyspark,spark-dataframe,python-multiprocessing,Python,Apache Spark,Pyspark,Spark Dataframe,Python Multiprocessing,用例如下所示: 我有一个很大的数据框,其中有一个“user\u id”列(每个user\u id可以出现在许多行中)。我有一个需要分析的用户列表 Groupby、filter和aggregate可能是个好主意,但pyspark中包含的可用聚合功能不适合我的需要。在pyspark版本中,用户定义的聚合函数仍然不完全受支持,我决定暂时不使用它 相反,我只是迭代my_users列表,过滤数据框中的每个用户,然后进行分析。为了优化这个过程,我决定为my_users中的每个用户使用python多处理池 进

用例如下所示:

我有一个很大的数据框,其中有一个“user\u id”列(每个user\u id可以出现在许多行中)。我有一个需要分析的用户列表

Groupbyfilteraggregate可能是个好主意,但pyspark中包含的可用聚合功能不适合我的需要。在pyspark版本中,用户定义的聚合函数仍然不完全受支持,我决定暂时不使用它

相反,我只是迭代my_users列表,过滤数据框中的每个用户,然后进行分析。为了优化这个过程,我决定为my_users中的每个用户使用python多处理池

进行分析(并传递到池)的函数有两个参数:用户id和主数据帧的路径,我在主数据帧上执行所有计算(拼花格式)。在该方法中,我加载dataframe并处理它(dataframe本身不能作为参数传递)

我在一些进程(每次运行都不同)上遇到各种奇怪的错误,看起来像:

  • JVM中不存在PythonUtils(读取“拼花”数据帧时)

  • 键错误:“c”未找到(同样,在读取“拼花地板”数据框时。“c”到底是什么??)
当我在没有任何多重处理的情况下运行它时,一切都很顺利,但速度很慢

你知道这些错误是从哪里来的吗

为了让事情更清楚,我将放一些代码示例:

PYSPRAK_SUBMIT_ARGS = '--driver-memory 4g --conf spark.driver.maxResultSize=3g --master local[*] pyspark-shell' #if it's relevant

# ....

def users_worker(df_path, user_id):
    df = spark.read.parquet(df_path) # The problem is here!
    ## the analysis of user_id in df is here

def user_worker_wrapper(args):
    users_worker(*args)

def analyse():
    # ...
    users_worker_args = [(df_path, user_id) for user_id in my_users]
    users_pool = Pool(processes=len(my_users))
    users_pool.map(users_worker_wrapper, users_worker_args)
    users_pool.close()
    users_pool.join()

事实上,正如@user6910411所评论的,当我将池更改为threadPool(multiprocessing.Pool.threadPool包)时,一切都按预期进行,这些错误都消失了


错误本身的根本原因现在也很清楚,如果您想让我分享,请在下面发表评论。

想知道错误的原因。我们最近得到了公司另一个团队的帮助,访问了一个集群环境,我们的想法也是一样的,但在我不断学习pyspark frameworkHi@AsishM的过程中,我们想了解一些陷阱。Spark提供了“应用程序内的计划”选项,您可以在上找到更多详细信息。您的用例涉及到集群配置,因此考虑事项略有不同。