# CleanFailedTransactions工具
#### 功能说明
清理Hudi表中失败的（心跳过期的inflight）事务。检测心跳已过期的inflight instant，并清理对应的instant文件、数据文件、心跳文件和.temp临时目录。适用于Hudi正常rollback无法清理的残留失败事务。
#### 约束
- 支持COW和MOR表。
- 工具会跳过非Hudi表和外部表。
- 工具执行时，如有写入操作正在运行，可能将正在进行的写入误判为失败事务。
 
#### 命令格式
```
spark-submit \
--master yarn \
--driver-memory 2G \
--num-executors 3 \
--executor-memory 4G \
--class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
/opt/hudi-fix-tools-1.0.jar \
${命令} "${表列表}"
```
#### 参数说明
| **参数** | **是否必选** | **参数说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| ${命令}  | 是        | - check：检测并输出失败的inflight事务及需要清理的文件。  - rollback：备份并清理失败的inflight事务（包括instant文件、数据文件、心跳文件、.temp/{instantTime}目录）。  - restore：对备份文件进行恢复，恢复到清理前的状态。  - cleanbackup：删除备份文件。   |
| ${表列表} | 是        | 两种输入方式： 1. 逗号分隔的库名.表名列表（如db1.t1,db2.t2）。  2. 保存表列表的文件路径，文件内容每行一张表，格式为库名.表名。   工具优先尝试作为文件路径读取，读取失败则按逗号分隔解析。自动跳过非Hudi表和外部表。                                                                                                                                                               |
   
#### Spark配置项
| **配置项**                                   | **默认值** | **说明**                                                                                    |
|:---|:---|:---|
| spark.hudi.force.clean.noSubsequentWrites | false   | 是否清理没有后续已完成写入的失败事务。默认只清理有后续已完成写入确认失败的过期事务（保守策略）；设为true时，也会清理没有后续已完成写入的过期事务（需确认没有正在进行的写入）。 |
   
#### 输出结果说明
| **字段**  | **说明**                             |
|:---|:---|
| RESULT  | success表示执行成功，failed表示执行失败         |
| MESSAGE | 检测到的失败事务信息、需要清理的文件列表、执行结果信息或执行失败信息 |
   
#### 使用样例
- 检查单张表的失败事务：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  check "mydb.mytable"
  ```
  

- 检查多张表的失败事务：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  check "mydb.table1,mydb.table2"
  ```
  

- 从文件读取表列表进行检查：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  check "/tmp/table_list.txt"
  ```
  
- 清理失败事务（自动备份）：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  rollback "mydb.mytable"
  ```
  
- 清理没有后续写入的失败事务（需确认无正在进行的写入）：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --conf spark.hudi.force.clean.noSubsequentWrites=true \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  rollback "mydb.mytable"
  ```
  
- 恢复备份：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  restore "mydb.mytable"
  ```
  
- 清理备份：
  ```
  spark-submit --master yarn --driver-memory 2G --num-executors 3 --executor-memory 4G \
  --class com.huawei.mrs.hudi.tools.CleanFailedTransactions \
  /opt/hudi-fix-tools-1.0.jar \
  cleanbackup "mydb.mytable"
  ```
  
 
