我正在尝试使用下推谓词读取数据集的子集。我的输入数据集包含 1,2TB 和 43436 个存储在 s3 上的镶木地板文件。使用下推谓词,我应该读取 1/4 的数据。
看到 Spark UI。我看到作业实际上读取了 1/4 的数据(300GB),但在作业的第一阶段仍有 43436 个分区,但是这些分区中只有 1/4 有数据,其他 3/4 是空的(检查附加屏幕截图中的中值输入数据)。
我期待 Spark 只为非空分区创建分区。与直接通过另一个作业(数据的 1/4)读取预过滤数据集相比,使用下推谓词读取整个数据集时,我看到了 20% 的性能开销。我怀疑这个开销是由于我在第一阶段有大量的空分区/任务,所以我有两个问题:
先感谢您
我刚刚了解了 Spark 3.0 中引入的新自适应查询执行 (AQE)。
在AQE决定切换到广播模式之前,第一阶段和第二阶段已经完全结束(包括地图侧洗牌)。
我的问题:既然两个数据集已经写入磁盘进行洗牌(地图侧洗牌),那么切换到广播是否已经太晚了?在大多数情况下,这种切换会比继续进行reduce side shuffle 更有效吗?我想是的,因为 Databricks 的人已经做了这个选择,但我想确保我没有错过任何东西..
optimization performance shuffle apache-spark apache-spark-sql
apache-spark ×2
performance ×2
amazon-s3 ×1
optimization ×1
parquet ×1
partitioning ×1
shuffle ×1