如何减少spark中的多个小文件加载时间

时间:2018-01-04 17:22:06

标签: scala apache-spark hadoop2

我在给定的HDFS位置有多个镶木地板格式的小文件(由于我们在给定月份每天收到两个或更多文件,因此计数在给定月份是递增的)。当我尝试从SPARK 2.1中的HDFS位置读取文件时,读取这些文件所花费的时间更多,并且在将更多小文件添加到给定位置时是增量的。

由于文件很小,我不想在HDFS中进一步分区。

通过在HDFS上创建目录来创建分区,然后将文件放在这些目录中。 文件格式为Parquet。

是否有其他格式或过程可以一次读取所有小文件,以便减少小文件的读取时间。

注意: 1)尝试创建一个可以将所有小文件合并到一个文件的程序,将为我的所有SLA添加额外的处理以完成我的过程,所以我会将此作为我的最后选项。

2 个答案:

答案 0 :(得分:1)

如果您不想合并文件,则应考虑重新设计上游流程以限制首先创建的文件数。如果生产者是Spark,那么在编写之前,您可以使用coalescerepartitionSpark dataframe write method writing many small files)数据。

除此之外(或作为一个单独的步骤合并),你无能为力。阅读小文件只是昂贵的。调整spark.sql.files.openCostInBytes

  

打开文件的估计成本(以字节数衡量)可以同时扫描。将多个文件放入分区时使用。过度估计会更好,那么带有小文件的分区将比具有更大文件的分区(首先安排的分区)更快。

可能在某种程度上有所帮助,但我不会指望奇迹。

答案 1 :(得分:0)

请尝试使用WholeTextFiles! 这适用于许多小文件。