pyspark 为什么从数据库抓取s3会耗尽内存?

thtygnil  于 2023-02-21  发布在  Spark
关注(0)|答案(1)|浏览(192)

我有一个S3桶安装到数据库,如下所示:

dbutils.fs.mount(f"s3a://{bucket}", "/mnt/data")

在桶下,有包含文件的文件夹,我只是这样列出:

from pathlib import Path
folder_path = Path(f'/dbfs/mnt/data/{folder_name}')
file_names = [p.name for p in folder_path.glob('*')]
print(f"# of files = {len(file_names)}")

有一个文件夹有200多万个文件,将其列出会占用几GB内存,驱动程序最终会崩溃(单节点群集有32 GB内存)。

我试着使用dbutils.fs.ls而不是pathlib列出文件,它需要更长的时间来运行,并且像上面一样耗尽内存。
这让我怀疑抓取s3的databricks实现很糟糕,或者我在这里做错了什么?注意我不能控制bucket下文件夹的结构,所以一个文件夹下可能有一亿个文件,而不把文件拆分成子文件夹。

b4qexyjb

b4qexyjb1#

对于S3中的大量文件,您将希望使用支持分页的API。这被认为是最佳实践,除非可以保证对象列表是受限制的
Boto3 Docs

相关问题