最佳文件大小和镶木地板块大小

时间:2019-05-23 10:32:11

标签: apache-spark amazon-s3 parquet

我每天大约有100 GB的数据,这些数据是使用Spark写入S3的。写入格式为实木复合地板。编写此应用程序的应用程序运行Spark 2.3

100 GB数据被进一步分区,其中最大分区为30 GB。对于这种情况,我们只考虑30 GB的分区。

我们计划在Spark 2.4中迁移整个数据并将其重写为S3。最初,我们在写入S3时并没有决定文件大小和块大小。现在,我们将重写所有内容,我们希望考虑最佳文件大小和镶木地板块大小。

  1. 在镶木地板中写入S3的最佳文件大小是多少?
  2. 我们能否写入1个文件,大小为30 GB,镶木地板块大小为512 MB?在这种情况下阅读将如何工作?
  3. 与#2相同,但镶木地板块的大小为1 GB?

1 个答案:

答案 0 :(得分:0)

在讨论方程式的拼花地板面之前,要考虑的一件事是将数据保存到拼花地板后如何使用数据。 如果要经常读取/处理它,则可能要考虑什么是访问模式,并决定相应地对其进行分区。 一种常见的模式是按日期分区,因为我们的大多数查询都具有时间范围。 适当地对数据进行分区将对数据写入后的性能产生更大的影响。

现在,在Parquet上,经验法则是Parquet块的大小应大致等于基础文件系统的大小。当您使用HDFS时,这很重要,但是当您使用S3时,这并不重要。

同样,Parquet块大小的考虑因素是如何读取数据。 由于必须在内存中基本重建Parquet块,因此它越大,下游需要的内存就越大。您还将需要较少的工人,因此,如果您的下游工人有足够的存储空间,则可以使用更大的镶木地板块,因为这样会稍微提高效率。

但是,为了获得更好的可伸缩性,通常最好有几个较小的对象(尤其是根据某些分区方案),而不是一个大对象,后者可能会成为性能瓶颈,具体取决于您的用例。

总结一下:

  • 镶木地板块的大小越大,意味着文件的大小就越小(因为压缩在大文件上效果更好),但是在序列化/反序列化时,内存占用量更大
  • 最佳文件大小取决于您的设置
  • 如果您以512MB镶木地板块大小存储30GB,则由于镶木地板是可拆分的文件系统,并且spark依赖于HDFS getSplits(),因此火花作业的第一步将有60个任务。他们将使用字节范围提取来并行获取同一S3对象的不同部分。但是,如果将其分解为几个较小的(最好是分区的)S3对象,则将获得更好的性能,因为它们可以并行写入(必须依次写入一个大文件),并且很可能在访问时具有更好的读取性能。大量的读者。