【问题标题】:Spark parquet read performanceSpark parquet 读取性能
【发布时间】:2020-05-17 04:35:48
【问题描述】:

我有一个月的数据存储在 HDFS 中。 31 个文件夹,每个文件夹按日期表示,格式为 yyyy-mm-dd。例如:2020-01-30

我们将每 5 分钟获取一次数据,并使用 spark append mode 将数据保存为 parquet 文件。所以一小时有 12 个文件,一天有 288 个文件。所以每个文件夹包含大约 288 个 parquet 文件。因此,对于 1 月份,大约是 8928(31*288) parquet 文件。

我将使用 spark 读取数据。

读取这么多文件会导致性能问题吗?

如果我每天维护一个文件。假设每天只包含一个 parquet 文件,而在一月​​份,31 parquet 文件。

如果我这样做会提高性能吗?

【问题讨论】:

    标签: apache-spark parquet


    【解决方案1】:

    如果您可以将一天的数据汇总到更少的文件中,那么您的性能肯定会提高。根据每个文件的大小以及 Spark 作业的数量或执行程序/核心,您将找到正确数量的分区。如果您写下有关数据的详细信息,例如大小、列数、每天的条目数和列类型(字符串、日期、整数等),我们将能够告诉您一个建议的最佳数字来聚合您的数据每天或每小时。

    我通常按天划分:

    ../my_parquet_table/year=2020/month=01/day=31/*.parquet
    

    在这个级别上,我通常会保留所有 parquet 文件以减小块的大小(在我的情况下为 256MB)。

    【讨论】:

      【解决方案2】:

      根据 spark 架构,它将尝试为驻留在 HDFS 上的数据文件创建分区,默认情况下,它基于您拥有的 HDFS 的块大小。如果您在 hdfs 上有小文件,它将尝试在 HDFS 中为每个文件获取尽可能多的块,最后在 spark 中创建尽可能多的分区,这可能会降低性能,因为其中涉及到大量的 shuffle 操作,并且 shuffle 是更昂贵的操作火花。

      在您的情况下,如果您每五分钟存储一次文件,并且如果文件很小,那么您可以将其组合成一个镶木地板文件。但是,您需要在 spark 中单独执行此活动,您可以在其中组合所有小 parquet 文件并创建一个 parquet 并进一步处理创建的大型 parquet 文件。

      如果只想在没有性能问题的情况下在一个脚本中执行此操作,则另一种解决方法,然后按原样加载小型 parquet 文件,然后使用合并或重新分区来创建更少的分区,从而加快处理速度。如果您想使用重新分区或合并,请巧妙地进行选择。

      我可以在这里分享一些代码sn-p来做到这一点,

      data  = spark.read.parquet("/my_parquet_table/year=2020/month=01/day=31/")
      pdata = data.reshuffle(5)   # here number of partition I put 5, but you can determine this number per data you receive every day
      
      #use pdata for further operation
      

      因此,最后,您有两种选择,或者创建单独的脚本,将小型 parquet 文件合并为一个,或者如果您不想单独执行,则将数据重新分区或合并到更少的分区并处理数据。

      【讨论】:

        猜你喜欢
        • 2017-07-26
        • 2017-01-16
        • 2018-02-04
        • 2020-10-28
        • 1970-01-01
        • 2019-03-08
        • 2015-12-19
        • 2018-06-27
        • 2017-04-24
        相关资源
        最近更新 更多