searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

hudi系列-小文件优化

2024-05-07 02:18:29
29
0

hudi使用mvcc来实现数据的读写一致性和并发控制,基于timeline实现对事务和表服务的管理,会产生大量比较小的数据文件和元数据文件。大量小文件会对存储和查询性能产生不利影响,包括增加文件系统的开销、文件管理的复杂性以及查询性能的下降。对于namenode而言,当整个集群中文件数到了几千万,就已经会变得很不稳定了。hudi自身提供了各种方法对表中产生的小文件进行了优化,总结下来无非是几种方式:

  1. 合并现有小文件
  2. 删除无用小文件
  3. 对于支持append的文件系统,直接往小文件追加数据,如hdfs

元数据文件优化

hudi使用元数据文件来管理和维护表的元数据信息,包括表的结构、分区信息、数据文件的位置和版本等。.hoodie是元数据根目录,直接目录下在存储着活跃时间线下所有的元数据,一般不会被删除,通过配置来控制活跃时间线的跨度,进而限制了元数据文件数量的无限增长。如果活跃时间线跨度过长,在timeline上的一些操作将变得更低效,对读、写和其它表服务都影响很大(hudi通过timeline server和MDT可以对此进行优化)。

较久前的元数据文件会定时被归档形成归档时间线,保存在archived目录中,随着归档文件不断增加,归档后的文件会自动rollover或合并,这取决于文件系统是否支持append.

数据文件优化


hdfs的思想是一次写入多次读取,不支持对已经存储在文件系统中的数据进行直接修改。hudi不公支持数据修改,还增加了流式处理的场景,流写数据不像批处理那么容易控制单文件大小,持续地、少量地写,是造成小文件泛滥的根本原因。

hudi提供了很多灵活的配置和机制来防止产生过多的小文件(所以在使用hudi时会涉及大量的表配置项),归纳总结,也就是针对表设计、写过程、写后管理这几个阶段进行改善

  • 分区:合理设计数据的分区,确保数据均匀分布,并尽量减少分区数量。过多的分区可能导致生成大量小文件。根据数据访问的模式和查询需求,选择合适的分区策略,避免生成过多的小文件。
  • 分桶:选择具有高基数的字段作为分桶字段,这样可以使数据在不同的桶之间更均匀地分布。高基数字段可以提供更好的数据分散性,减少小文件的生成。根据数据量和并行写入的需求,调整分桶的数量。分桶数量太少可能导致数据不均匀分布,而分桶数量太多可能会增加小文件的数量。需要根据实际情况进行调优,平衡数据分布和查询性能。
  • 增加每次写入数据量,hudi写入前数据一般会缓存在内存中,到达条件后触发刷盘,可以提高缓存容量,但是这样会稍微降低写入的时效性。当使用flink时,可以增大write.batch.size,write.task.max.size以及checkpoint间隔。
  • 控制数据文件上限,通过hoodie.parquet.max.file.size,hoodie.logfile.max.size来设置base文件和log文件的最大值
  • 定期compact,将多个小文件合并成一个或少数几个更大的文件,减少文件数量并提高文件的利用率。需要根据具体的应用场景和需求,选择合适的合并策略和压缩配置,并进行监控和优化。
  • 定期clustering,数据根据指定的字段值进行分组,并将相同值的数据聚集在一起存储,从而减少小文件的数量
  • 定期clean,清理和删除不再需要的小文件,须要注意的是,需要设置合理的策略
  • 数据压缩:可以在存储数据时对数据文件进行压缩,从而减少存储空间的占用,支持多种压缩算法,如Snappy、Gzip、LZO、BZip2等。可以根据存储需求和性能要求选择合适的压缩算法。不同的压缩算法在压缩比、压缩速度和解压缩性能方面有所差异。
0条评论
0 / 1000