如何解决有没有办法限制PySpark中某些内存密集型UDF计算的节点级并行化?
背景
PySpark允许您将任意熊猫函数应用于Spark DataFrame的组,如下所示:
import pandas as pd
from pyspark.sql.functions import pandas_udf,PandasUDFType
df = spark.createDataFrame(
[(1,1.0),(1,2.0),(2,3.0),5.0),10.0)],("id","v"))
@pandas_udf(df.schema,PandasUDFType.GROUPED_MAP)
def subtract_mean(pdf):
v = pdf.v
return pdf.assign(v=v - v.mean())
df.groupby("id").apply(subtract_mean).show()
在后台,Spark将数据从df
分发到工作节点,并根据“ id”进行分区,将用户定义的pandas函数并行应用于每个组,然后将这些结果的并集
问题 我要运行的熊猫UDF非常占用内存。当Spark尝试在同一节点上并行运行许多UDF实例(例如说64个)时,该节点内存不足,并且UDF抛出内存错误。
问题 有没有办法告诉Spark:“跨节点并行化此分组的UDF,但在每个节点上最多只能并行运行k个UDF实例”? (例如,k = 1表示每个节点一次只能执行一个UDF实例)。
解决方案中的重大尝试
将df
分成较小的块,然后使用for循环对其进行串行处理。为什么这样不好?因为我们希望Spark利用跨节点的并行化优势!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。