PySpark 分区镶木地板需要很长时间才能加载,即使使用指定的模式

问题描述 投票:0回答:1

设置:我有一个包含约 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 新用户,希望得到任何见解。

python pyspark parquet
1个回答
0
投票

以下是一些潜在的考虑因素:

  1. 本地操作时,有效并行度受到机器上物理核心数量的限制。例如,如果有 2 个 CPU,则并行度上限为 2。

  2. 您在分布式系统中遇到了一个常见的挑战,即“小文件问题”。假设您的文件大小为 8MB,明显小于 128MB 的块大小,每个文件都会在其各自的节点上触发一个任务。对于 1300 个文件,这个打开、读取和关闭的过程会重复 1300 次,从而在主服务器上产生开销并创建多个执行程序。

要解决此问题,请考虑将这些文件连接成更大的 128MB 大小的文件。这种整合应该会显着提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.