Apache spark 火花拼花地板阅读性能

Apache spark 火花拼花地板阅读性能,apache-spark,parquet,Apache Spark,Parquet,我有一个月的数据存储在HDFS中。31个文件夹,每个文件夹按日期表示,格式为yyyy-mm-dd。例如:2020-01-30 每隔5分钟,我们将获取数据,并使用spark append mode将数据保存为拼花地板文件。所以一小时12个文件,一天288个文件。所以每个文件夹包含大约288个拼花文件。因此,1月份大约是8928(31*288)parquet文件 我将使用spark读取数据 读取这么多文件会导致性能问题吗 如果我每天都保存一个文件。假设每天只包含一个拼花文件,对于一月,则为31个拼花

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

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

我将使用spark读取数据

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

如果我每天都保存一个文件。假设每天只包含一个拼花文件,对于一月,则为31个拼花文件


如果我这样做,性能是否会提高?

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

我通常按天划分:

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

在这个级别上,我通常将所有拼花地板文件的大小保持在块大小以下(在我的情况下为256MB)。

根据spark体系结构,它将尝试为驻留在HDF上的数据文件创建分区,默认情况下,它基于您拥有的HDF的块大小。如果您在hdfs上有小文件,它将尝试在hdfs中获取每个文件多达个块,最终在spark中创建尽可能多的分区,这可能会降低性能,因为其中涉及到大量的洗牌操作,而在spark中洗牌操作的成本更高

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

另一个解决方法是,如果希望只在一个脚本中执行,而不存在性能问题,则按原样加载小拼花文件,然后使用合并或重新分区来创建更少的分区,从而加快处理速度。如果要使用重新分区或合并,请巧妙地进行选择

我可以在这里分享一些代码片段

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
最后,您有两种选择,一种是创建单独的脚本,将小拼花文件合并为一个,另一种是如果不想单独执行,则重新分区或将数据合并到较少的分区中并处理数据