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

Vij*_*ant 5 amazon-s3 apache-spark parquet

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

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

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

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

Rob*_*giu 11

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

现在,在 Parquet 上,经验法则是 Parquet 块大小与底层文件系统的大小大致相同。这在您使用 HDFS 时很重要,但在您使用 S3 时则无关紧要。

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

但是,为了获得更好的可扩展性,通常最好有几个较小的对象 - 特别是根据某些分区方案 - 而不是一个大对象,这可能会成为性能瓶颈,具体取决于您的用例。

把它们加起来:

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