
# Hudi Compaction操作说明
#### 操作场景
随着MOR（Merge-On-Read，读时合并）表持续写入更新数据，增量日志文件（Log文件，Avro行式格式）不断累积，查询时需要合并大量Log文件与Base文件（Parquet列存文件），导致查询性能逐渐下降。为解决此问题，Hudi提供Compaction操作，将Log文件与Base文件合并为新的Base文件，从而提升查询性能。Compaction操作分为同步和异步两种执行方式。
Hudi的Compaction操作是用于优化数据文件，用于合并mor表Base和Log文件，来提高查询性能和存储效率。
对于Merge-On-Read表，数据使用列式Parquet文件和行式Avro文件存储，更新被记录到增量文件，然后进行同步/异步compaction生成新版本的列式文件。Merge-On-Read表可减少数据摄入延迟，因而进行不阻塞摄入的异步Compaction很有意义。
#### 执行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;
    ```
    
   
 
异步Compaction会进行如下两个步骤：
1. 调度Compaction：由入湖作业完成，在这一步，Hudi扫描分区并选出待进行compaction的FileSlice，最后CompactionPlan会写入Hudi的Timeline。
2. 执行Compaction：一个单独的进程/线程将读取CompactionPlan并对FileSlice执行Compaction操作。
 
异步方式由Spark SQL来实现，具体请参考[COMPACTION](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24277.html)章节。
如果需要在异步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-lts-mrs/mrs_01_24032.html#mrs_01_24032__section1529461811174)章节。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
为了保证入湖的最高效率，推荐使用同步产生compaction调度计划，异步执行compaction调度计划的方式。
