如何减少火花中的多个小文件加载时间
Posted
技术标签:
【中文标题】如何减少火花中的多个小文件加载时间【英文标题】:how to reduce multiple small file load time in spark 【发布时间】:2018-01-04 17:22:05 【问题描述】:我在给定的 HDFS 位置有多个 parquet 格式的小文件(给定月份的计数是递增的,因为我们在给定月份每天收到两个或更多文件)。当我尝试从 SPARK 2.1 中的 HDFS 位置读取文件时,读取这些文件所需的时间会更多,并且当更多小文件添加到给定位置时会增加。
由于文件很小,我不想在 HDFS 中进一步分区。
通过在 HDFS 上创建目录来创建分区,然后将文件放置在这些目录中。 文件格式为 Parquet。
有没有其他的格式或者流程可以一次性读取所有的小文件,这样可以减少读取小文件的时间。
注意: 1) 尝试创建一个可以将所有小文件合并到一个文件的程序将为我的所有 SLA 添加额外的处理以完成我的流程,所以我会将其保留为我的最后一个选择。
【问题讨论】:
【参考方案1】:如果您不想合并文件,则应首先考虑重新设计上游流程以限制创建文件的数量。如果生产者是 Spark,您可以在写入之前例如 coalesce
或 repartition
(Spark dataframe write method writing many small files) 数据。
除此之外(或合并为一个单独的步骤),您无能为力。读取小文件很昂贵。调整spark.sql.files.openCostInBytes
:
打开文件的估计成本,以可以同时扫描的字节数来衡量。这用于将多个文件放入分区中。最好高估,那么小文件的分区会比大文件的分区快(先调度)。
可能在一定程度上有所帮助,但我不指望奇迹。
【讨论】:
【参考方案2】:请尝试使用整个文本文件! 这适用于许多小文件。
【讨论】:
以上是关于如何减少火花中的多个小文件加载时间的主要内容,如果未能解决你的问题,请参考以下文章