
# 选择合适的表服务执行方式
 #### 方式一：表服务与写任务一起执行
**严格按照模板执行，不允许删除/增加/修改其中的参数**。
1. insert overwrite场景。
   - 此场景不管是cow表还是mor表，都只需要做clean和archive，不需要做compaction。
   
   - 推荐直接用cow表。
     按照下面这个模板直接使用：
     ```
     set hoodie.cleaner.commits.retained = 5; // clean默认是开启的，insert overwrite场景clean保留的版本数不能太多，设置为5已足够。
     set hoodie.keep.min.commits = 6; // archive默认是开启的，archive最少保留的元数据个数比clean保留的版本数多就可以。
     set hoodie.keep.max.commits = 7; // archive最大保留的元数据个数
     insert overwrite SinkTable select * from SourceTable;
     ```
     
    

2. insert into场景。
   - cow表：
     insert into场景，无需配置任何参数。
     ```
     insert into SinkTable select * from SourceTable;
     ```
     
   
   - mor表：
     insert into场景，只需要考虑compaction的触发频率。
     ```
     set hoodie.compact.inline.max.delta.commits = X; // 参数默认值是5。业务侧要考虑往Hudi表写入X次所追加的log文件的大小，控制log文件的大小在300M以内性能最佳。举例，写入10次之后log文件的大小为500M，如果想控制log文件的大小在100M，可以粗略设置该参数的值为100/(500/10)=2。
     set hoodie.cleaner.commits.retained = X + 1; 
     set hoodie.keep.min.commits = X + 10;
     set hoodie.keep.max.commits = X + 20;
     insert into SinkTable select * from SourceTable;
     ```
     
    
 
 #### 方式二：表服务与写任务分开执行
**严格按照模板执行，不允许删除/增加/修改其中的参数**
1. 写任务中配置。
   - cow表： 直接使用[方式一：表服务与写任务一起执行]。
     
   
   - mor表：
     ```
     set hoodie.compact.inline = true;
     set hoodie.schedule.compact.only.inline=true;
     set hoodie.compact.inline.max.delta.commits = X; // 参数默认值是5。业务侧要考虑往Hudi表写入X次所追加的log文件的大小，控制log文件的大小在300M以内性能最佳。举例，X值当前是10，写入10次之后log文件的大小为500M，如果想控制log文件的大小在100M，可以粗略设置该参数的值为100/(500/10)=2。
     set hoodie.clean.automatic = false;
     set hoodie.archive.automatic = false;
     insert into SinkTable select * from SourceTable;
     ```
     
    
2. 异步脚本执行表服务。 **该异步脚本通常需要在DGC平台上进行定时调度，对读性能要求比较高建议1小时调度一次，其它可以设置为2\~4小时调度一次。**
   mor表：
   ```
   set hoodie.clean.automatic = false;
   set hoodie.clean.async = false;
   set hoodie.archive.automatic = false;
   set hoodie.archive.async = false; 
   set hoodie.compact.inline = true;
   set hoodie.run.compact.only.inline = true;
   set hoodie.cleaner.commits.retained = X + 1;
   set hoodie.keep.min.commits = X + 10;
   set hoodie.keep.max.commits = X + 20;
   run compaction on <database name>. <table name>;   -- 执行Compaction计划
   run clean on <database name>. <table name>;        -- 执行Clean操作
   run archivelog on <database name>.<table name>;    -- 执行Archive操作
   ```
   
 
#### 表服务选择技巧
- 只要是cow表，选择[方式一：表服务与写任务一起执行]。
- 只要是insert overwrite写入，无论是cow表还是mor表，选择[方式一：表服务与写任务一起执行]。
- mor表使用insert into方式写入，如果业务可以接受mor表在写入X次之后因触发了compaction/clean/archive而导致任务时长比平时至少增加1\~2倍，则可以选择[方式一：表服务与写任务一起执行]；否则，选择[方式二：表服务与写任务分开执行]。
- spark/flink streaming场景，选择[方式二：表服务与写任务分开执行]。
- Flink CDC写Hudi mor表场景，选择[方式二：表服务与写任务分开执行]。同时，由于CDC场景会开启changelog，需要在异步表服务脚本中添加"set hoodie.allow.operation.metadata.field = true"。
 
