performance - Spark不忽略空分区

标签 performance apache-spark amazon-s3 partitioning parquet

我正在尝试使用下推谓词读取数据集的子集。
我的输入数据集包含 1,2TB 和 43436 个存储在 s3 上的 Parquet 文件。使用下推谓词,我应该读取 1/4 的数据。
看到 Spark UI。我看到作业实际上读取了 1/4 的数据(300GB),但在作业的第一阶段仍有 43436 个分区,但是这些分区中只有 1/4 有数据,其他 3/4 是空的(检查附加屏幕截图中的中值输入数据)。
我期待 Spark 只为非空分区创建分区。与直接通过另一个作业(数据的 1/4)读取预过滤数据集相比,使用下推谓词读取整个数据集时,我看到了 20% 的性能开销。我怀疑这个开销是由于我在第一阶段有大量的空分区/任务,所以我有两个问题:

  • 是否有任何解决方法可以避免这些空分区?
  • 您认为是否有其他原因需要对开销负责?可能是下推过滤器执行自然有点慢?

  • 先感谢您
    spark ui data read
    enter image description here

    最佳答案

    使用 S3 Select ,您只能检索数据的一个子集。

    With Amazon EMR release version 5.17.0 and later, you can use S3 Select with Spark on Amazon EMR. S3 Select allows applications to retrieve only a subset of data from an object.


    否则,S3 充当对象存储,在这种情况下,必须读取整个对象。 在您的情况下,您必须读取所有文件中的所有内容,并在客户端过滤它们 .
    其实有很相似的question ,通过测试您可以看到:

    The input size was always the same as the Spark job that processed all of the data


    您还可以查看 this question关于优化从 s3 of parquet files 读取的数据.

    关于performance - Spark不忽略空分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62581371/

    相关文章:

    java - AWS Java 开发工具包 : check if an object exists with a specific version in an S3 bucket

    ios - 找到要上传到的最快的 S3 存储桶

    mysql - distinct or group?哪个在mysql中效率更高?

    performance - 分析可视化工具?

    java - 关于条件的 Hibernate Search 性能建议

    arrays - 无法理解寻峰算法的差异

    scala - 平面图 scala [String, String,List[String]]

    scala - 在大型数据集上运行 Spark 时出现 "sparkContext was shut down"

    windows - 为什么 Zeppelin 0.6.2 笔记本在 Windows 上使用 Spark 2.0 失败并显示 "The input line is too long"?

    amazon-s3 - Terraform 共享状态