Doris跨HDFS恢复

将环境A中的备份的DORIS数据(HDFS),复制到内网中的HDFS上再进行DORIS数据库恢复。

DORIS数据备份(HDFS)


参考:https://blog.youkuaiyun.com/alksjdfp32r/article/details/148900842

复制备份数据

将快照数据备份出来存储在文件系统中

docker exec -it  hadoop-datanode-1 /bin/bash

hadoop fs -get  /doris ./
ls -lh
du -sh doris/
tar -cvf doris.tar doris/
ls -lh

docker cp  hadoop-datanode-1:/root/doris.tar /data/hadoop/doris_bak_20250125.tar
Successfully copied 95MB to /data/hadoop/doris_bak_20250125.tar

上传至HDFS



可在Web界面中清理HDFS相关目录后,通过命令将之前存储在文件系统中的数据上传到HDFS上

hdfs dfs -put doris /

在目标DORIS库中创建仓库  

CREATE REPOSITORY hdfs_repo

查看快照

SHOW SNAPSHOT ON hdfs_repo;

恢复快照

RESTORE SNAPSHOT

查看进度

SHOW RESTORE FROM your_db\G;

如果出现异常,先取消,处理异常后再次进行恢复快照的操作

CANCEL RESTORE FROM your_db;

可能的异常


err: (255), Unknown error 255), reason: IOException: Blocklist for dat xxxxxxxx  has changed!
  NameNode 元数据未同步或 DataNode 数据块不可用,也可能导致 blocklist 不一致。
  检查 HDFS 文件状态
  使用 HDFS 命令检查目标文件的状态和 block 信息:
 

hdfs fsck /path/to/your/file.dat -files -blocks

  可以在稍等会,等NN和DN数据同步后,再次进行恢复。


相关命令参考官网:

https://doris.apache.org/zh-CN/docs/admin-manual/data-admin/backup-restore/restore

<think> 我们正在使用Apache Doris,需要实现ODS层保留最近30天历史数据。 在Doris中,我们可以通过以下几种方式实现: 1. 使用分区表(Partition)和动态分区特性自动删除旧分区。 2. 使用数据过期策略(TTL)自动删除过期数据。 根据Doris的文档和最佳实践,推荐使用分区表并结合动态分区规则来实现自动删除旧分区。 具体步骤如下: ### 1. 创建ODS表时定义分区和分桶 在Doris中,我们通常按时间进行分区,比如按天分区。同时,我们可以设置动态分区规则,自动创建新分区和删除旧分区。 示例创建表的SQL: ```sql CREATE TABLE ods_table ( id BIGINT, data VARCHAR(50), ... -- 其他字段 dt DATE -- 日期字段,用于分区 ) ENGINE=OLAP UNIQUE KEY(id, dt) -- 注意:Doris中唯一键模型,分区键和分桶键需要放在唯一键中 PARTITION BY RANGE(dt)() -- 按日期范围分区,初始为空分区 DISTRIBUTED BY HASH(id) BUCKETS 10 -- 分桶 PROPERTIES ( "dynamic_partition.enable" = "true", -- 开启动态分区特性 "dynamic_partition.time_unit" = "DAY", -- 按天分区 "dynamic_partition.start" = "-30", -- 保留最近30天(包括今天) "dynamic_partition.end" = "3", -- 提前创建3天的分区 "dynamic_partition.prefix" = "p", -- 分区名前缀 "dynamic_partition.buckets" = "10", -- 分桶数(可覆盖分桶设置) "replication_num" = "1" -- 副本数 ); ``` 动态分区相关参数说明: - `dynamic_partition.enable`: 开启动态分区功能。 - `dynamic_partition.time_unit`: 动态分区的时间单位,可以是DAY、WEEK、MONTH。 - `dynamic_partition.start`: 保留的分区数量,负值表示删除多少天前的分区。例如,设置为-30表示删除30天前的分区(即保留最近30天)。 - `dynamic_partition.end`: 提前创建的分区数量,正值表示提前创建多少天的分区。 - `dynamic_partition.prefix`: 分区名前缀,例如分区名为`p20230101`。 - `dynamic_partition.buckets`: 动态创建的分区的分桶数量。 注意:上述设置会自动删除30天前的分区,并自动创建未来3天的分区(防止未来数据到来)。 ### 2. 数据加载 在加载数据时,我们只需要将数据插入到对应的分区即可。由于我们开启动态分区,当插入的数据对应分区不存在时,Doris会自动创建分区(在`dynamic_partition.end`指定的范围内)。 例如,插入当天的数据: ```sql INSERT INTO ods_table (id, data, dt) VALUES (1, 'test', '2023-10-20'); ``` ### 3. 验证分区状态 可以查看分区的状态,确认分区是否按预期保留和删除: ```sql SHOW DYNAMIC PARTITION TABLES; -- 查看动态分区配置 SHOW PARTITIONS FROM ods_table; -- 查看当前存在的分区 ``` ### 4. 注意事项 - **分区字段类型**:分区字段必须是DATE或DATETIME类型,并且必须包含在唯一键中(对于Unique Key模型)或作为聚合键(对于Aggregate Key模型)。 - **动态分区调整**:动态分区的属性可以通过`ALTER TABLE`修改,例如: ```sql ALTER TABLE ods_table SET ("dynamic_partition.start" = "-30"); ``` - **手动删除分区**:如果需要手动删除分区,可以使用: ```sql ALTER TABLE ods_table DROP PARTITION p20200101; ``` - **冷热数据分离**:对于更久之前的数据,如果需要归档,可以导出到冷存储(如HDFS、S3)后删除Doris中的分区。 ### 5. 其他实现方式:TTL(Time To Live) 除了动态分区,Doris还支持通过TTL设置表的过期时间。但是,TTL是按表设置的,不能按分区设置。因此,如果我们希望保留整个表最近30天的数据,可以设置表级别的TTL。 示例: ```sql CREATE TABLE ods_table_ttl ( id BIGINT, data VARCHAR(50), ..., dt DATE ) ENGINE=OLAP UNIQUE KEY(id, dt) DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES ( "replication_num" = "1", "storage_medium" = "SSD", "storage_cooldown_time" = "2023-11-20 00:00:00" -- 仅对SSD->HDD有效,不适用于自动删除 ); ``` 注意:目前Doris的TTL主要用于数据冷却(从SSD移动到HDD),并不能自动删除数据。自动删除数据的功能建议使用动态分区。 因此,我们优先推荐使用动态分区方案。 ### 6. 补充:使用事件或定时任务删除旧分区(备选方案) 如果动态分区不满足需求,我们可以创建定时任务,通过事件或外部调度系统(如Doris的Event Scheduler、Airflow等)执行删除旧分区的SQL。 例如,每天执行: ```sql ALTER TABLE ods_table DROP PARTITION IF EXISTS p20200101; -- 删除指定分区 ``` 但这种方式需要自己计算30天前的分区名,不如动态分区方便。 综上所述,在Doris中实现ODS层保留30天数据,最佳实践是使用动态分区功能。 --- ### 相关问题 1. Doris动态分区还有哪些配置参数?如何调整分区创建和删除的规则? 2. 在Doris中如何手动管理分区(如增加、删除、合并分区)? 3. 动态分区和手动分区在性能上有什么区别? 4. 如何监控Doris中分区的数据量和状态? [^1]: Apache Doris 动态分区文档 </think> 在 Apache Doris 中实现 ODS 层保留最近 30 天数据的解决方案,可通过**动态分区管理 + TTL 策略**实现高效数据生命周期管理。以下是具体实现方案: ### 1. 创建动态分区表 ```sql CREATE TABLE ods_table ( id BIGINT, data VARCHAR(50), event_time DATETIME, dt DATE COMMENT "分区字段" -- 关键分区字段 ) ENGINE=OLAP UNIQUE KEY(id, dt) -- 唯一键需包含分区键 PARTITION BY RANGE(dt)() -- 声明为范围分区 DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-30", -- 保留最近30天 "dynamic_partition.end" = "3", -- 预创建未来3天分区 "dynamic_partition.prefix" = "p", "replication_num" = "1" ); ``` **动态分区参数说明**: - `start = -30`:自动删除 30 天前的旧分区 - `end = 3`:提前创建未来 3 天的空分区 - `time_unit = DAY`:按天管理分区 - `prefix = "p"`:分区名前缀(如 p20231020) - 分区字段 `dt` 必须是唯一键组成部分[^1] ### 2. 数据加载示例 ```sql -- 增量数据写入(自动路由到对应分区) INSERT INTO ods_table (id, data, event_time, dt) VALUES (1001, 'order', '2023-10-20 14:30:00', '2023-10-20'); ``` ### 3. 分区状态验证 ```sql -- 查看分区保留情况 SHOW DYNAMIC PARTITION TABLES; -- 检查具体分区 SHOW PARTITIONS FROM ods_table; ``` 输出示例: ``` PartitionName | VisibleVersion | VisibleTime p20230921 | 2 | 2023-09-21 <-- 即将过期 p20231020 | 1 | 2023-10-20 <-- 最新分区 ``` ### 4. 冷数据归档(可选) 对需要长期保留的重要数据,转存到冷存储: ```sql -- 导出30天前数据HDFS EXPORT TABLE ods_table TO "hdfs://backup/ods_archive/" WITH BROKER "hdfs_broker" PROPERTIES ( "dt.lt" = "2023-09-20" -- 导出条件 ); -- 清理已归档数据 ALTER TABLE ods_table DROP PARTITION p20230920; ``` ### 5. 监控与优化 1. **分区监控**: ```sql -- 检查分区大小 SELECT PARTITION_NAME, TABLE_ROWS, DATA_SIZE FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='ods_table'; ``` 2. **存储优化**: ```sql -- 启用压缩 ALTER TABLE ods_table SET ("storage_medium" = "SSD"); ``` 3. **自动调度**: 通过 Doris 内置事件调度器定期检查: ```sql CREATE EVENT clean_ods ON SCHEDULE EVERY 1 DAY DO ALTER TABLE ods_table DROP PARTITION WHERE dt < NOW()-INTERVAL 30 DAY; ``` ### 关键优势 1. **自动滚动清理**:通过 `dynamic_partition.start=-30` 实现无人值守清理 2. **高效元数据操作**:分区删除仅操作元数据,秒级完成[^3] 3. **存储成本优化**:冷热数据分层存储(SSD+HDD) 4. **查询加速**:分区裁剪使查询仅扫描相关分区 > **注意事项**: > - 分区字段必须包含在唯一键中 > - 避免在业务高峰期执行 `DROP PARTITION` > - 建议保留 35 天数据作为缓冲(设置 `start=-35`) > - 重要数据删除前需确认备份状态 --- ### 相关问题 1. 如何验证 Doris 动态分区规则是否生效? 2. 分区删除后如何从备份恢复特定时间点的数据? 3. Doris 动态分区与 Hive 分区管理有哪些核心差异? 4. 如何监控 Doris 分区的数据量增长趋势? [^1]: Apache Doris 动态分区文档 [^2]: Doris 在网易游戏的实时数仓实践 [^3]: Doris 在作业帮实时数仓的应用经验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值