
# 离线Compaction配置
对于MOR表的实时业务，通常设置在写入中同步生成compaction计划，因此需要额外通过DataArts或者脚本调度SparkSQL去执行已经产生的compaction计划。
- 执行参数
  ```
  set hoodie.compact.inline = true;                //打开compaction操作
  set hoodie.run.compact.only.inline = true;       //compaction只执行已生成的计划，不产生新计划
  set hoodie.cleaner.commits.retained = 120;       // 清理保留120个commit
  set hoodie.keep.max.commits = 140;               // 归档最大保留140个commit
  set hoodie.keep.min.commits = 121;               // 归档最小保留121个commit
  set hoodie.clean.async = false;                  // 关闭异步清理
  set hoodie.clean.automatic = false;              // 关闭自动清理，防止compaction操作触发clean
   
  run compaction on $tablename;                    // 执行compaction计划
  run clean on $tablename;                         // 执行clean操作清理冗余版本
  run archivelog on $tablename;                    // 执行archivelog合并清理元数据文件
  ```
  ![](https://support.huaweicloud.com/sqlref-hudi-dli/public_sys-resources/caution_3.0-zh-cn.png)
  - 关于清理、归档参数的值不宜设置过大，会影响Hudi表的性能，通常建议：
    - hoodie.cleaner.commits.retained = compaction所需要的commit数的2倍
    
    - hoodie.keep.min.commits = hoodie.cleaner.commits.retained + 1
    
    - hoodie.keep.max.commits = hoodie.keep.min.commits + 20
     
  
  - 执行compaction后再执行clean和archive，由于clean和archivelog对资源要求较小，为避免资源浪费，使用DataArts调度的话可以compaction作为一个任务，clean、archive作为一个任务分别配置不同的资源执行来节省资源使用。
    
- 执行资源
  - Compaction调度的间隔应小于Compaction计划生成的间隔，例如1小时左右生成一个Compaction计划的话，执行Compaction计划的调度任务应该至少半小时调度一次。
  
  - Compaction作业配置的资源，vcore数至少要大于等于单个分区的桶数，vcore数与内存的比例应为1：4即1个vcore配4G内存。
   
 
