开启TableStatus多版本特性下,最新tablestatus文件丢失或损坏,如何恢复
问题
开启TableStatus多版本特性下,最新的tablestatus文件丢失或其他异常原因损坏的情况下,如何恢复?
回答
使用当前可得的最近的tablestatus文件进行恢复,分为如下两个场景来进行恢复:
场景一:当前批次的CarbonData数据文件和.segment文件损坏无法恢复。
- 进入客户端节点,执行如下命令,查看HDFS对应表的tablestatus文件,找到最近的tablestatus版本号。
source bigdata_env
source Spark/component_env
kinit 组件业务用户 (普通集群无需执行kinit命令)
hdfs dfs -ls /user/hive/warehouse/hrdb.db/car01/Metadata
上图中,当前批次文件tablestatus_1669028899548损坏,需要使用tablestatus_1669028852132文件。
- 进入spark sql,执行如下命令来修改表属性latestversion为当前最近的版本号。
alter table car01 set SERDEPROPERTIES ('latestversion'='1669082252132');
需要退出当前session,重新连接后执行查询。该方式已尽可能恢复客户数据,一般现网情况下,如断电场景segment数据文件也会存在不可恢复情况。
场景二:当前批次的Carbondata数据文件和.segment文件完整,可恢复。
使用TableStatusRecovery恢复工具,当前工具仅针对非分区表进行恢复。进入Spark客户端节点,执行如下命令:
cd 客户端安装路径
source bigdata_env
source Spark/component_env
kinit 组件业务用户 (普通集群无需执行kinit命令)
spark-submit --master yarn --class org.apache.carbondata.recovery.tablestatus.TableStatusRecovery Spark/spark/carbonlib/carbondata-spark_*.jar hrdb car01
参数说明:hrdb car01表名称。
TableStatusRecovery恢复工具限制:
- 合并后,如果tablestatus文件丢失或损坏,使用该工具无法恢复合并状态的segment,因为丢失或损坏的tablestatus文件才存在该segment合并信息。
- Delete segment by Id/Date后,如果tablestatus文件丢失或损坏,则无法恢复已删除的segment信息,因为只有丢失或损坏的tablestatus文件才存在该segment的删除信息。
- 不支持在mv表上使用该工具。
- 由于最新的tablestatus文件存在问题,使用该工具恢复后无法正常查询时,可以移除最新的tablestatus文件,使用上一个tablestatus文件进行恢复。