Was*_*oui 6 performance partitioning amazon-s3 apache-spark parquet
我正在尝试使用下推谓词读取数据集的子集。我的输入数据集包含 1,2TB 和 43436 个存储在 s3 上的镶木地板文件。使用下推谓词,我应该读取 1/4 的数据。
看到 Spark UI。我看到作业实际上读取了 1/4 的数据(300GB),但在作业的第一阶段仍有 43436 个分区,但是这些分区中只有 1/4 有数据,其他 3/4 是空的(检查附加屏幕截图中的中值输入数据)。
我期待 Spark 只为非空分区创建分区。与直接通过另一个作业(数据的 1/4)读取预过滤数据集相比,使用下推谓词读取整个数据集时,我看到了 20% 的性能开销。我怀疑这个开销是由于我在第一阶段有大量的空分区/任务,所以我有两个问题:
先感谢您
空分区:似乎spark(2.4.5)试图通过将许多文件打包到一个分区中来真正拥有大小为\xe2\x89\ x88spark.sql.files.maxPartitionBytes(默认128MB)的分区,源代码在这里。\n但是它在运行作业之前完成这项工作,因此它无法知道在应用下推谓词后有 3/4 的文件不会输出数据。对于仅放置其行将被过滤掉的文件的分区,我最终得到了空分区。这也解释了为什么我的最大分区大小是 44MB 而不是 128MB,因为没有一个分区偶然有通过所有下推过滤器的文件。
\n20% 的开销:最后,这不是由于空分区造成的,我通过将 Spark.sql.files.maxPartitionBytes 设置为 1GB 设法减少了空分区,但它并没有提高读取性能。我认为开销是由于打开许多文件并读取其元数据造成的。\nSpark 估计打开一个文件相当于读取 4MB spark.sql.files.openCostInBytes。因此,即使由于过滤器而不会被读取,打开许多文件也不应该被忽略。
\n 归档时间: |
|
查看次数: |
374 次 |
最近记录: |