【问题标题】:Performance of spark while reading from hive vs parquet从蜂巢与镶木地板读取时火花的性能
【发布时间】:2021-09-05 07:55:53
【问题描述】:

假设我在按日期分区的顶级 parquet/orc 文件上有一个外部 hive 表,那么使用会对性能产生什么影响

spark.read.parquet("s3a://....").filter("date_col='2021-06-20'")

v/s

spark.sql("select * from table").filter("date_col='2021-06-20'")

读入一个dataframe后,会进行一系列的转换和聚合。

spark 版本:2.3.0 或 3.0.2

蜂巢版本:1.2.1000

每天的记录数:300-700 百万

我的预感是,在使用上述任一查询时不会有任何性能差异,因为 parquet 本机具有 hive 元存储可以提供的大部分优化,并且 spark 能够使用它。比如,谓词下推,列存储的优势等。

作为后续问题,如果

  1. 基础数据是 csv 而不是 parquet。在顶部放置 Hive 表会提高性能吗?
  2. Hive 表被分桶。在这种情况下读取底层文件系统而不是从表中读取是否有意义?

另外,与 hive 相比,直接从 parquet 读取是否是更好的选择?

【问题讨论】:

    标签: apache-spark hive apache-spark-sql parquet


    【解决方案1】:

    Hive 在这里实际上应该更快,因为它们都有下推,Hive 已经存储了架构。您在此处读取的镶木地板将需要推断合并的模式。您可以通过提供架构使它们大致相同。

    您可以通过直接导航到分区来使 Parquet 版本更快。这避免了必须对可用分区进行初始过滤。

    所以这样的事情就可以做到:

    spark.read.option("basePath", "s3a://....").parquet("s3a://..../date_col=2021-06-20")
    

    请注意,如果您已经有一个架构,这会最有效,因为这也会跳过架构合并。

    关于你的后续行动:

    1. 如果它是 CSV,那将产生巨大的差异,因为它必须解析所有数据,然后过滤掉这些列。 CSV 对于大型数据集真的很糟糕。
    2. 不应该真的让你获得那么多,而且可能会给你带来麻烦。 Hive 存储的元数据可以让 Spark 在此处比您自己尝试更有效地导航您的数据。

    【讨论】:

    • 总而言之,如果我们提供以下内容,通过 parquet reader 读取的性能将与从 Hive Metastore 读取的性能相同 1. 分区的直接路径。 2. 文件的架构。另外,我在某处读到,如果我们可以自己定义数据集模式,Spark 读取原始文件会更快,因为我们绕过了到 Hive Metastore 的额外跃点。这有多真实?
    • 它实际上会比 Hive 快,因为这样 Spark 可以直接访问文件,而不是要求 Hive 服务为它们提供服务(因此跳过了那个额外的中间人)。拥有架构更快,因为它不需要从 Hive Metastore 推断或读取,这意味着您所说的内容是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2016-12-11
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2020-01-10
    相关资源
    最近更新 更多