设置:我有一个包含约 1300 个分区镶木地板文件的文件夹(例如,
C:\Project Data\Data-*.parquet)
,其中 * 是一个计数器,每个文件大小约为 8MB。所有文件都具有相同的架构。
我正在本地模式下运行 PySpark,如下所示。当我尝试使用
读取分区的镶木地板文件时#initiate spark session
conf = pyspark.SparkConf().set('spark.driver.memory', '3g')
spark = (
SparkSession.builder
.master("local[10]")
.config(conf=conf)
.appName("Spark Local")
.getOrCreate()
)
#get schema from one file (this cell works fine)
df_sample = spark.read.parquet(r"C:\Project Data\Data-0.parquet")
schema = df_sample.schema
#read all files
df = spark.read.format("parquet")\
.schema(schema)\
.load(r"C:\Project Data\Data-*.parquet")
问题:pyspark 执行该单元需要很长时间。看起来它试图将所有数据加载到内存中(因为我的内存消耗慢慢增加),而我的印象是它这样做是懒惰的(因此加载和显示前几行应该非常快)。但显然还有其他事情正在发生。我是 Spark 新用户,希望得到任何见解。
以下是一些潜在的考虑因素:
本地操作时,有效并行度受到机器上物理核心数量的限制。例如,如果有 2 个 CPU,则并行度上限为 2。
您在分布式系统中遇到了一个常见的挑战,即“小文件问题”。假设您的文件大小为 8MB,明显小于 128MB 的块大小,每个文件都会在其各自的节点上触发一个任务。对于 1300 个文件,这个打开、读取和关闭的过程会重复 1300 次,从而在主服务器上产生开销并创建多个执行程序。