【发布时间】:2020-09-25 15:43:56
【问题描述】:
我正在使用 pandas udf 在 Dataproc (Spark) 中的 GCP 上训练许多 ML 模型。主要思想是我有一个分组变量,它代表我的数据框中的各种数据集,我运行如下:
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def test_train(grp_df):
#train model on grp_df
#evaluate model
#return metrics on
return (metrics)
result=df.groupBy('group_id').apply(test_train)
这工作正常,除非我使用非采样数据,其中返回的错误似乎与内存问题有关。这些消息是神秘的(对我来说),但如果我对它运行的数据进行采样,如果我不这样做,它就会失败。错误消息是这样的:
OSError:读取超出范围(偏移量 = 631044336,大小 = 69873416) 文件大小为 573373864
或
容器因超出内存限制而被 YARN 杀死。 24.5 GB 的 24 已使用 GB 物理内存。考虑提升 spark.yarn.executor.memoryOverhead 或禁用 由于 YARN-4714,yarn.nodemanager.vmem-check-enabled。
我的问题是如何在集群中设置内存以使其正常工作?
我了解每组数据和正在运行的进程都需要完全适合执行程序的内存。我目前有一个包含以下内容的 4-worker 集群:
如果我认为最大group_id中的最大数据大小需要150GB的内存,看来我真的需要每台机器一次操作一个group_id。与拥有单个工作人员或 VM 相比,我的速度至少提高了 4 倍。
如果我执行以下操作,这实际上是否为每台机器创建了 1 个执行程序,可以访问所有内核减去 1 和 180 GB 的内存?因此,如果理论上最大的数据组可以在具有这么多 RAM 的单个 VM 上工作,那么这个过程应该可以工作吗?
spark = SparkSession.builder \
.appName('test') \
.config('spark.executor.memory', '180g') \
.config('spark.executor.cores', '63') \
.config('spark.executor.instances', '1') \
.getOrCreate()
【问题讨论】:
-
可以使用多个工人吗?当您在不同的组上运行算法时,我想知道也许它可以在每个组上运行并在不同的机器(执行器)上拆分。
标签: apache-spark pyspark google-cloud-storage google-cloud-dataproc pyarrow