Memory 当使用pyu-udf时,python工作者使用了太多的内存并超出了内存限制

Memory 当使用pyu-udf时,python工作者使用了太多的内存并超出了内存限制,memory,pyspark,jupyter-notebook,user-defined-functions,Memory,Pyspark,Jupyter Notebook,User Defined Functions,spark版本是2.4.0,我的集群有四个节点,每个节点有16个CPU和128g RAM。 我正在使用jupyter笔记本电脑conncet pyspark。工作过程通过spark读取kudu数据,然后通过udf进行计算。在终端上启动pyspark PYSPARK_DRIVER_PYTHON="/opt/anaconda2/envs/py3/bin/jupyter" PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark

spark版本是2.4.0,我的集群有四个节点,每个节点有16个CPU和128g RAM。 我正在使用jupyter笔记本电脑conncet pyspark。工作过程通过spark读取kudu数据,然后通过udf进行计算。在终端上启动pyspark

PYSPARK_DRIVER_PYTHON="/opt/anaconda2/envs/py3/bin/jupyter" PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark2 --jars kudu-spark2_2.11-1.7.0-cdh5.15.0.jar 
--conf spark.executor.memory=40g --conf spark.executor.memoryOverhead=5g --num-executors=4 --executor-cores=8 --conf yarn.nodemanager.vmem-check-enabled=false
我的数据集只有6g和32个分区。运行时,我可以看到每个节点都有一个执行器,其中包含8个python worker,每个python worker使用6g内存!由于内存限制,容器被纱线杀死。 因超过内存限制而被纱线杀死的容器。使用45.1 GB的45 GB物理内存。考虑提升火花.纱线.执行器.内存开销

我很困惑为什么它会占用这么多的内存?每个分区的数据大小仅为~200M。pandas_udf不是在避免pyarrow的序列化和反序列化吗?也许是jupyter引起了这个问题? 如果有人帮助我,我非常感激。 这是我的密码

df = spark.range(0, 800000000)
df= df.select("id",rand(seed=10).alias("uniform"),randn(seed=27).alias("normal"),    
randn(seed=27).alias("normal1"),randn(seed=1).alias("normal3")) 
df=df.withColumn("flag",
F.array(
F.lit("0"),
F.lit("1"),
F.lit("2"),
F.lit("3"),
F.lit("4"),
F.lit("5"),
    F.lit("6"),
F.lit("7"),
F.lit("8"),
F.lit("9"),
F.lit("10"),
F.lit("11"),
      F.lit("12"),
F.lit("13"),
F.lit("14"),
F.lit("15"),
F.lit("16"),
F.lit("17"),
      F.lit("18"),
F.lit("19"),
F.lit("20"),
F.lit("21"),
F.lit("22"),
).getItem(
(F.rand()*23).cast("int")
) )


您好,最好为运行的可能导致问题的命令获取更多上下文-是否有可能有一个进程正在驱动程序节点上收集结果?你打什么类型的熊猫?很抱歉,我没有看到你的回复。我添加了代码。非常感谢您的帮助
from pyspark.sql.functions import pandas_udf, PandasUDFType
from pyspark.sql.types import *
schema = StructType([
StructField("flag", IntegerType()),    
])
@pandas_udf(schema, functionType=PandasUDFType.GROUPED_MAP)
def del_data(data):
    import os
    os.environ["ARROW_PRE_0_15_IPC_FORMAT"] = "1"
    return data[["flag"]]
df.groupBy('flag').apply(del_data).write.csv('/tmp/')