我有一个月的数据存储在HDFS中。 31个文件夹分别按日期表示,格式为yyyy-mm-dd
。例如:2020-01-30
每隔5分钟,我们将获取数据,并将使用spark append mode
作为木地板文件保存数据。因此,一小时12个文件,一天288个文件。因此,每个文件夹包含大约288个实木复合地板文件。因此,对于一月月份,大约有8928(31*288)
个实木复合地板文件。
我将使用spark读取数据。
读取这么多文件会导致性能问题吗?
如果我每天都维护一个文件。假设每天仅包含一个实木复合地板文件,而在一月份,31
个实木复合地板文件。
如果这样做,性能会有所提高吗?
答案 0 :(得分:1)
如果可以在更少的文件中聚合一天的数据,那么肯定会提高性能。根据每个文件的大小以及您的Spark作业的数量或执行者/内核,您会找到合适数量的分区。如果您写有关数据的详细信息,例如大小,列数,每天的条目数和列类型(字符串,日期,整数等),我们将告诉您建议的最佳数目,以汇总数据每天或每小时。
我通常按天分区:
../my_parquet_table/year=2020/month=01/day=31/*.parquet
在这个级别上,我通常使所有实木复合地板文件的大小都小于一个块的大小(在我的情况下为256MB)。
答案 1 :(得分:0)
根据spark架构,它将尝试为驻留在HDFS上的数据文件创建分区,默认情况下,它基于您拥有的HDFS的块大小。如果hdfs上的文件较小,则它将尝试在HDFS中获取每个文件最多的块,最终在spark中创建尽可能多的分区,这可能会降低性能,因为其中涉及大量的随机播放操作,而随机播放是更昂贵的操作火花。
在您的情况下,如果每五分钟存储一次文件,并且文件很小,则可以将其组合成一个实木复合地板文件。但是,您需要在spark中单独执行此活动,在此您可以合并所有小型镶木文件并创建一个镶木,然后进一步处理创建的大型镶木文件。
如果只想在一个脚本中执行此操作而没有性能问题,然后按原样加载小木地板文件,然后使用合并或重新分区创建较少的分区,这又可以使处理更快,则可以解决此问题。如果要使用分区或合并,请明智地选择。
我可以在此处共享一些代码段
162.250.198.98:
因此,最后,您有两个选择,要么创建单独的脚本(将小型实木复合地板文件合并为一个),要么如果不想单独进行处理,则将数据重新分区或合并为更少的分区和过程数据。