
# Hudi Compaction操作说明
Compaction用于合并mor表Base和Log文件。
对于Merge-On-Read表，数据使用列式Parquet文件和行式Avro文件存储，更新被记录到增量文件，然后进行同步/异步compaction生成新版本的列式文件。Merge-On-Read表可减少数据摄入延迟，因而进行不阻塞摄入的异步Compaction很有意义。
- 异步Compaction会进行如下两个步骤：
  1. 调度Compaction：由入湖作业完成，在这一步，Hudi扫描分区并选出待进行compaction的FileSlice，最后CompactionPlan会写入Hudi的Timeline。
  
  2. 执行Compaction：一个单独的进程/线程将读取CompactionPlan并对FileSlice执行Compaction操作。
   
- 使用Compaction的方式分为同步和异步两种：
  - 同步方式由参数hoodie.compact.inline控制，默认为true，自动生成compaction调度计划并执行compaction：
    - 关闭同步compaction datasource写入时可以通过**.option("hoodie.compact.inline", "false")**来关闭自动compaction。
      spark-sql写入时可以通过**set hoodie.compact.inline=false;**来关闭自动compaction。
      
    
    - 仅同步生成compaction调度而不执行compaction
      - ·datasource写入时可以通过以下option参数来实现： **option("hoodie.compact.inline", "true").**
        **option("hoodie.schedule.compact.only.inline", "true").**
        **option("hoodie.run.compact.only.inline", "false").**
        
      
      - ·spark-sql写入时可以通过set 以下参数来实现： **set hoodie.compact.inline=true;**
        **set hoodie.schedule.compact.only.inline=true;**
        **set hoodie.run.compact.only.inline=false;**
        
       
     
  
  - 异步方式由spark-sql来实现。 如果需要在异步compaction时只执行已经产生的compaction调度计划而不创建新的调度计划，则需要通过set命令设置以下参数：
    **set hoodie.compact.inline=true;**
    **set hoodie.schedule.compact.only.inline=false;**
    **set hoodie.run.compact.only.inline=true;**
    更多compaction参数请参考[compaction\&cleaning配置](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_24097.html)章节。
    ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
    为了保证入湖的最高效率，推荐使用同步产生compaction调度计划，异步执行compaction调度计划的方式。
    
   
 
