Apache Spark 和 Hudi:大量的输出文件

Posted

技术标签:

【中文标题】Apache Spark 和 Hudi:大量的输出文件【英文标题】:Apache Spark and Hudi: tons of output files 【发布时间】:2021-04-14 15:03:13 【问题描述】:

我正在尝试从许多不同的 .csv 文件(都具有相同的“结构”)中读取数据,使用 Spark 执行一些操作,最后将它们保存为 Hudi 格式。 要将数据存储在同一个 Hudi 表中,我认为最好的方法是在执行写入时使用 append 方法。 问题是这样做会创建大量的小文件,其总和尺寸远远超过输入数据集的大小(在某些情况下是 10 倍)。

这是我对 Hudi 的配置:

hudi_options = 
  'hoodie.table.name': tableName,
  'hoodie.datasource.write.recordkey.field': 'uuid',
  'hoodie.datasource.write.partitionpath.field': 'main_partition',
  'hoodie.datasource.write.table.name': tableName,
  'hoodie.datasource.write.operation': 'upsert',
  'hoodie.datasource.write.precombine.field': 'ts',
  'hoodie.upsert.shuffle.parallelism': 10, 
  'hoodie.insert.shuffle.parallelism': 10,
  'hoodie.delete.shuffle.parallelism': 10

虽然写操作是这样执行的:

result_df.write.format("hudi").options(**hudi_options).mode("append").save(basePath) 其中 result_df 是一个 Spark Dataframe,其架构始终相同,但数据不同,并且 basePath 是常量。 我检查了输出文件的内容,它们具有正确的架构/数据。那么,有没有办法将数据附加到同一个 Hudi 表文件中? 我对 apache Spark 和 Hudi 还很陌生,因此非常感谢任何帮助/建议;-)

【问题讨论】:

您还面临这个问题吗? Apache Hudi 的工作原理是 MVCC(多版本并发控制),因此每次写入都会在以下情况下创建现有文件的新版本: 1. 如果文件大小小于默认的最大文件大小:100 MB 2.如果您要更新现有文件中的现有记录。将这两个选项添加到您的 hudi_options,它在任何给定时间仅保留最新的两个版本:“hoodie.cleaner.commits.retained”:1,“hoodie.keep.min.commits”:2 如果仍有问题,请分享您的完成配置细节,然后我可以帮助你。 谢谢!我有同样的问题,你的评论真的很有用。现在只记录最新的两个版本的输出文件。 【参考方案1】:

请提出 github issue(httsp://github.com/apache/hudi/issues) 以获得社区的及时响应

【讨论】:

【参考方案2】:

Apache Hudi 的工作原理是 MVCC(多版本 并发控制),因此每次写入都会创建一个新版本的 现有文件在以下情况下: 1. 如果文件大小小于 默认最大文件大小:100 MB 2. 如果您要更新现有文件 现有文件中的记录。将这两个选项添加到您的 hudi_options,在任何给定时间仅保留最新的两个版本: “hoodie.cleaner.commits.retained”:1,“hoodie.keep.min.commits”:2

来自a comment by @felix-k-jose

【讨论】:

以上是关于Apache Spark 和 Hudi:大量的输出文件的主要内容,如果未能解决你的问题,请参考以下文章

真香!PySpark整合Apache Hudi实战

真香!PySpark整合Apache Hudi实战

基于 Apache Hudi 和 Apache Spark Sql 的近实时数仓架构分享

基于 Apache Hudi 和 Apache Spark Sql 的近实时数仓架构分享

数据湖之Hudi:Hudi与Spark和HDFS的集成安装使用

调优 | Apache Hudi应用调优指南