当前位置: 首页 > 知识库问答 >
问题:

在S3中存储时正确的镶木地板文件大小?

笪成周
2023-03-14

我一直在阅读有关此主题的一些问题以及几个论坛,并且在所有这些论坛中,他们似乎都提到从Spark中产生的每个. parkethtml" target="_blank">文件应该是64MB或1GB大小,但仍然无法让我想到哪些案例场景属于每个这些文件大小以及除了HDFS将它们拆分为64MB块之外的原因。

我当前的测试场景如下。

dataset
  .coalesce(n) # being 'n' 4 or 48 - reasons explained below.
  .write
  .mode(SaveMode.Append)
  .partitionBy(CONSTANTS)
  .option("basepath", outputPath)
  .parquet(outputPath)

我目前每天处理2.5GB到3GB的数据,这些数据每年将被拆分并保存到每日存储桶中。n等于4或48的原因只是为了测试,因为我事先知道测试集的大小,所以我尽量获得接近64MB或1GB的数字。我还没有实现代码来缓冲所需的数据,直到我得到之前需要保存的确切大小。

所以我的问题是。。。

如果我不打算使用HDFS,而只是从S3存储和检索数据,那么我应该考虑这么大的尺寸吗?

而且,如果我计划使用HDFS存储结果,它应该是最大10GB左右的每日数据集的最佳大小。拼花锉刀?

任何其他优化技巧将非常感激!

共有1个答案

席乐童
2023-03-14

您可以控制拼花地板文件的分割大小,前提是使用snappy之类的可分割压缩保存它们。对于s3a连接器,只需设置fs即可。s3a。块将大小设置为不同的字节数。

更小的拆分尺寸

  • 更多的工人可以同时处理一个文件。如果你有空闲的工人,加快速度
  • 更多启动开销计划工作、启动处理、提交任务
  • 从输出中创建更多文件,除非重新分区

小文件与大文件

小文件:

  • 不管你愿不愿意,你都能得到那份小份
  • 即使你使用了不可丢弃的压缩
  • 列出文件需要更长的时间。在s3上列出目录树非常慢
  • 无法要求比文件长度更大的块大小
  • 如果您的s3客户端不在块中进行增量写入,则更容易保存。(如果设置spark.Hadoop.fs.s3a.fast.upload true,Hadoop 2.8就可以了

就个人而言,这是观点,一些基准测试驱动的——但不是你的问题

  • 保存到更大的文件。
  • 活泼。
  • 深而窄的更浅更宽的目录树

阅读

  • 使用不同的块大小;将32-64 MB视为最小值
  • Hadoop 3.1,使用零重命名提交者。否则,切换到v2
  • 如果您的FS连接器支持这一点,请确保打开随机IO(hadoop-2.8spark.hadoop.fs.s3a.experimental.fadvise随机
  • 通过保存到更大的文件。赔偿()
  • 留意您正在收集的数据量,因为存储大量旧数据很容易产生巨额账单。

另请参阅使用S3/ADLS/WASB提高火花性能

 类似资料:
  • 问题内容: 有没有办法从Java创建镶木地板文件? 我的内存中有数据(java类),我想将其写入一个Parquet文件中,以便以后从apache-drill中读取它。 有没有简单的方法可以做到这一点,例如将数据插入sql表? 得到它了 谢谢您的帮助。 结合答案和此链接,我能够创建一个实木复合地板文件并用钻头将其读回。 问题答案: 不建议使用ParquetWriter的构造函数(1.8.1),但不建

  • 我有一个超过10亿行的DataFrame(df) 从上面的命令中,我了解到我的100个工作节点集群(spark 2.4.5)中只有5个工作节点将执行所有任务。使用聚结剂(5)需要7小时才能完成。 我应该尝试< code >重新分区而不是< code >联合? 有没有一种更快速/高效的方法来写出128 MB大小的拼花文件,或者我需要首先计算数据帧的大小来确定需要多少分区。 例如,如果我的数据帧大小为

  • 我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。 它是用这样的东西保存的 如您所见,我没有对数据帧进行分区,因为它只包含一个日期。 例如,第一天的第一个文件将存储在文件夹中 交易/2019/08/25 然后第二天,它就会在文件夹里 贸易/2019/08/26 问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HD

  • 我正在尝试使用火花在S3文件中生成拼花文件,目的是稍后可以使用presto从拼花中查询。基本上,它看起来是这样的, <代码>Kafka- 我能够使用Spark在S3中生成拼花并且工作正常。现在,我正在查看presto,我想我发现它需要hive meta store才能从拼花中查询。即使拼花保存模式,我也无法让presto读取我的拼花文件。那么,这是否意味着在创建拼花文件时,火花作业还必须将元数据存

  • 我通过两种方法生成拼花地板文件:动弹消防软管和火花作业。它们都被写入S3上相同的分区结构中。两组数据都可以使用相同的Athena表定义进行查询。两者都使用gzip压缩。 然而,我注意到Spark生成的拼花地板文件大约是Firehose生成的拼花地板文件的3倍大。有什么理由会这样吗?在使用Pyarrow加载模式和元数据时,我确实注意到了一些差异: 模式差异可能是罪魁祸首吗?还有别的原因吗? 这两个特

  • 我使用prestodb和hive metastore作为模式存储,使用alluxio缓存作为数据的外部存储。alluxio和hive模式中使用的存储格式是PARQUET。同时使用配置单元目录从presto检索时间戳字段。我会跟踪错误。 列 utdate 声明为类型时间戳,但 Parquet 文件将列声明为 INT64 类型 数据集的架构为 创建表测试( utcdate timestamp ) WI