该处的小文件合并,是一个广义的hudi数据表的重新组织优化,包括 MOR 表的行文件和基础base 文件的合并;基础base 文件的合并及数据重新排序;历史版本数据的清理等操作。hudi自身提供的上述相关操作同步和异步处理,但是在生产环境中会影响业务数据任务的正常运行,因此正常情况下使用异步的方式对hudi 数据表文件进行整理优化,提高数据访问性能。上述文件的优化合并及清理功能,理论上没有先后顺序。实际使用上建议的数据文件优化处理流程如下:
Compaction
该功能只对MOR 表有效(如果hudi 表类型是COW 表,该步骤省略),该功能是将mor 表的base file 和 log file 进行整理合并成一个新的base file,以提高查询执行效率,其异步执行参数和命令如下:
spark-submit --class org.apache.hudi.utilities.HoodieCompactor \
/xxx/hudi-utilities-bundle_2.12-*.jar \
--spark-memory '4g' \
--mode 'scheduleAndExecute' \
--base-path "/user/hive/warehouse/hudi.db/small_file_hudi_mor" \
--table-name "small_file_hudi_mor" \
--hoodie-conf "hoodie.compact.schedule.inline=false" \
--hoodie-conf "hoodie.compact.inline=false" \
--hoodie-conf "hoodie.compact.inline.max.delta.commits=1"
核心参数说明:
| 配置项 | 设定值 | 说明 |
|---|---|---|
| jar 路径及版本 | /xxx/hudi-utilities-bundle_2.12-*.jar | jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。 |
| --spark-memory | 4g | spark 计算资源内存使用,根据实际数据情况调整计算资源量。 |
| --mode | scheduleAndExecute | Compaction 执行模式设置参数,设置为排期并执行,在一个任务里面完成相关的合并操作。 |
| --base-path | /user/hive/warehouse/hudi.db/small_file_hudi_mor | 进行 Compaction 的数据路径信息,设置为对应表的路径,进行整个表的数据合并。 |
| --table-name | small_file_hudi_mor | 要Compaction 的数据表名。 |
| hoodie.compact.schedule.inline | false | hudi 配置项,是否进行异步调度排期。这里使用异步模式。设置为false |
| hoodie.compact.inline | false | hudi 配置项,是否内联同步合并。这里使用异步模式。设置为false |
| hoodie.compact.inline.max.delta.commits | 1 | 触发Compaction 之前要保留的最大增量提交数,提交多少次commits 后,才触发合并。 |
其他参数详见:https://hudi.apache.org/docs/configurations#Compaction-Configs
Clustering
Clustering 是一种通用的数据布局优化手段,Spark SQL/Hive 中的 cluster by 和 Cassandra 中的 clustering key 都是 Clustering 思想的具体实现,只是 Hudi 的 Clustering 除了这一标准功能外还多了一项合并小文件的工作。该处主要进行小文件合并处理,如果业务上有需要,可以添加数据重排序处理,其异步执行参数和命令如下:
spark-submit --jars 'hudi-utilities-bundle_2.12-*.jar' \
--class 'org.apache.hudi.utilities.HoodieClusteringJob' \
/xxx/hudi-utilities-bundle_2.12-*.jar \
--spark-memory '4g' \
--mode 'scheduleAndExecute' \
--base-path "/user/hive/warehouse/hudi.db/small_file_hudi_cow/" \
--table-name "small_file_hudi_cow" \
--hoodie-conf "hoodie.clustering.async.enabled=true" \
--hoodie-conf "hoodie.clustering.async.max.commits=1" \
--hoodie-conf "hoodie.clustering.plan.strategy.small.file.limit=536870912" \
--hoodie-conf "hoodie.clustering.plan.strategy.target.file.max.bytes=1073741824"
核心参数说明:
| 配置项 | 设定值 | 说明 |
|---|---|---|
| jar 路径及版本 | /xxx/hudi-utilities-bundle_2.12-*.jar | jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。 |
| --spark-memory | 4g | spark 计算资源内存使用,根据实际数据情况调整计算资源量。 |
| --mode | 'scheduleAndExecute' | Clustering 执行模式设置参数,设置为排期并执行,在一个任务里面完成相关的小文件合并操作。 |
| --base-path | /user/hive/warehouse/hudi.db/small_file_hudi_mor | 进行 Clustering 的数据路径信息,设置为对应表的路径,进行整个表的数据小文件合并。 |
| --table-name | small_file_hudi_mor | 要Clustering 的数据表名。 |
| hoodie.clustering.async.enabled | true | hudi 配置项,是否允许异步小文件合并。这里使用异步模式。设置为true |
| hoodie.clustering.async.max.commits | 1 | hudi 配置项,异步合并小文件执行的最大 commit 数。 |
| hoodie.clustering.plan.strategy.small.file.limit | 536870912 | hudi 配置项,小于该值时,被认为小文件。然后对这些小文件进行合并。 |
| hoodie.clustering.plan.strategy.target.file.max.bytes | 1073741824 | 合并后的文件最大大小, |
| hoodie.clustering.plan.strategy.sort.columns | 数据列 | 排序列,根据业务查询需要,可以在合并过程中进行数据排序。 |
其他参数详见:https://hudi.apache.org/docs/configurations#Clustering-Configs
Cleaning
对于每次更新hudi 表数据,就会生成一个新版本的数据文件用于保存更新后的记录(COPY_ON_WRITE) 或将这些增量更新写入日志文件以避免重写更新版本的数据文件 (MERGE_ON_READ)。在这种情况下,根据更新频率,文件版本数可能会无限增长,但大部分业务如果不需要保留无限的历史记录。因此就需要通过清理服务,来删除历史不需要的版本数据,其异步执行参数和命令如下:
spark-submit --class org.apache.hudi.utilities.HoodieCleaner /xxx/hudi-utilities-bundle_2.12-*.jar \
--target-base-path "/user/hive/warehouse/hudi.db/small_file_hudi_cow/" \
--hoodie-conf "hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS" \
--hoodie-conf "hoodie.cleaner.fileversions.retained=1" \
--hoodie-conf "hoodie.cleaner.parallelism=200" \
--hoodie-conf "hoodie.clean.async=true" \
--hoodie-conf "hoodie.clean.automatic=false"
核心参数说明:
| 配置项 | 设定值 | 说明 |
|---|---|---|
| jar 路径及版本 | /xxx/hudi-utilities-bundle_2.12-*.jar | jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。 |
| hoodie.cleaner.policy | KEEP_LATEST_FILE_VERSIONS | hudi 配置项,清理策略。设置为保留N个版本数据。 |
| hoodie.cleaner.fileversions.retained | 1 | hudi 配置项,保留多少个版本数据,根据业务情况进行设置。 |
| hoodie.cleaner.parallelism | 200 | hudi 配置项,清理执行的并行度。 |
| hoodie.clean.async | true | hudi 配置项,是否异步清理。设置为true。 |
| hoodie.clean.automatic | false | hudi 配置项,是否自动内联清理,因为异步清理,设置为false。 |
其他参数详见:https://hudi.apache.org/docs/configurations#Clean-Configs