1,背景
程序正常入库,由于入库使用的队列资源太小,需要重新调整,先停止了之前load队列的任务,重新启动后,发现carbondata表中什么都没有了,segments全部都是空的
2,由于是现网环境,非常着急,第一时间停止了etl入库进程,并查看了回收站,回收站没有发现文件
3,排查 /user/hive/warehouse/表/Fact/Part0/这个目录下数据还在,至少数据没有被删掉
放心了数据还在
排查 /user/hive/warehouse/tablename表名/LockFiles这里是存放已经入库的数据记录 4,排查 /user/hive/warehouse/表/Metadata中的tablestatus,发现生成了一个tablestatus.history的,同时tablesttus中数据是空的
5,尝试通过tablestatus.history恢复,重命名为tablestatus,发现所有segments的状态都是mark for delete ,这下完了这都是被标记删除的segment
6,没办法,只能重新组装tablestatus的内容,手动在 /user/hive/warehouse/表/Fact/Part0/中根据信息和/user/hive/warehouse/gn_fw_carbon/Metadata/segments中对应segment的信息(这里是存放segment的原数据信息,包括对应的segment在哪个位置,以及对应的文件存放的位置,segments的状态)
组装对应的segment的大小,名称,开始时间和结束时间等信息
正常的segment的信息
{“timestamp”:“1737051059535”,“loadStatus”:“Success”,“loadName”:“609”,“dataSize”:“4030”,“indexSize”:“1083”,“loadStartTime”:“1737051053486”,“segmentFile”:“609_1737051053486.segment”}
7,验证正常了
8,附加自动生成tablestatus的代码
package com.eversee.bu;/**
* @author buchifna
* @date 2025/1/15 11:37
*/
import com.google.gson.Gson;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author : 不吃饭
* @description :
* @createDate : 2025/1/17 11:37
**/
public class BuildMetadataCarbondata1 {
public static void main(String[] args