快照使用场景:
防止用户的错误操作:
管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行回复。
备份:
管理员可以根据需求来备份整个文件系统,一个目录或者单一一个文件。管理员设置一个只读快照,并使用这个快照作为整个全量备份的开始点。增量备份可以通过比较两个快照的差异来产生。
试验/测试:
目录
一个用户当想要在数据集上测试一个应用程序。一般情况下,如果不做该数据集的全量拷贝,测试应用程序会覆盖/损坏原来的生产数据集,这是非常危险的。
管理员可以为用户设置一个生产数据集的快照(Read write)用于用户测试使用。在快照上的改变不会影响原有数据集。
灾难恢复:
只读快照可以被用于创建一个一致的时间点镜像用于拷贝到远程站点作灾备冗余。
通过下面命令对某一个路径(根目录/,某一目录或者文件)开启快照功能,那么该目录就成为了一个snapshottable的目录。
相关命令:
hdfs dfsadmin
[-allowSnapshot <snapshotDir>]
hdfs dfs
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
基本语法
1.hdfs dfsadmin -allowSnapshot 路径 (功
能描述:开启指定目录的快照功能)
2.hdfs dfsadmin -disallowSnapshot 路径 (功能描述:禁用指定目录的快照功能,默认是禁用)
3.hdfs dfs -createSnapshot 路径 (功能描述:对目录创建快照)
4.hdfs dfs -createSnapshot 路径 名称 (功能描述:指定名称创建快照)
5.hdfs dfs -renameSnapshot 路径 旧名称 新名称 (功能描述:重命名快照)
6.hdfs lsSnapshottableDir (功能描述:列出当前用户所有可快照目录)
7.hdfs snapshotDiff 路径1 路径2 (功能描述:比较两个快照目录的不同之处)
8.hdfs dfs -deleteSnapshot (功能描述:删除快照)
--示例:
不扯理论,直接搞起。。。。。。。。。相信看了下面实操,大家会有更加深入的了解。
--实操模拟:
1.先创建目录,存放表数据文件
hdfs dfs -mkdir hdfs://ha-nameservice/user/hive/warehouse/fw/
impala shell 里面创建表
CREATE TABLE default.test_fw (
id INT,
name STRING
)
STORED AS TEXTFILE
LOCATION 'hdfs://ha-nameservice/user/hive/warehouse/fw/test_fw';
插入数据
[cluster-node-1:25003] default> insert into test_fw select * from test_fw2;
Query: insert into test_fw select * from test_fw2
Query submitted at: 2021-04-28 09:53:22 (Coordinator: http://cluster-node-3:25000)
Query progress can be monitored at: http://cluster-node-3:25000/query_plan?query_id=dd4ec981b0b7e576:d7b3fefa00000000
Modified 3 row(s) in 3.97s
[cluster-node-1:25003] default>
查看文件:
[root@cluster-node-1 ~]# hdfs dfs -ls hdfs://ha-nameservice/user/hive/warehouse/fw/
Found 1 items
drwxrwxr-x - impala hive 0 2021-04-28 09:53 hdfs://ha-nameservice/user/hive/warehouse/fw/test_fw
[root@cluster-node-1 ~]#
先开启snapshot,锁定目录hdfs://ha-nameservice/user/hive/warehouse/fw/
[root@cluster-node-1 ~]# hdfs dfsadmin -allowSnapshot /user/hive/warehouse/fw/
Allowing snapshot on /user/hive/warehouse/fw/ succeeded
创建快照
[root@cluster-node-1 ~]# hdfs dfs -createSnapshot /user/hive/warehouse/fw/ fw_bak
Created snapshot /user/hive/warehouse/fw/.snapshot/fw_bak
[root@cluster-node-1 ~]# hdfs dfs -ls /user/hive/warehouse/fw/.snapshot/
Found 1 items
drwxrwxr-x - ossuser hive 0 2021-04-28 09:57 /user/hive/warehouse/fw/.snapshot/fw_bak
--第一个实验,删除HDFS文件:
[root@cluster-node-1 ~]# hdfs dfs -ls /user/hive/warehouse/fw/test_fw
Found 3 items
drwxrwxr-x - impala hive 0 2021-04-28 09:53 /user/hive/warehouse/fw/test_fw/_impala_insert_staging
-rw-rw-r-- 3 impala hive 18 2021-04-28 09:53 /user/hive/warehouse/fw/test_fw/dd4ec981b0b7e576-d7b3fefa00000000_999020081_data.0.
-rw-rw-r-- 3 impala hive 32 2021-04-28 09:53 /user/hive/warehouse/fw/test_fw/dd4ec981b0b7e576-d7b3fefa00000001_1243238308_data.0.
[root@cluster-node-1 ~]# hdfs dfs -rm -r /user/hive/warehouse/fw/test_fw/
21/04/28 09:59:37 INFO fs.TrashPolicyDefault: Moved: 'hdfs://ha-nameservice/user/hive/warehouse/fw/test_fw' to trash at: hdfs://ha-nameservice/user/ossuser/.Trash/Current/user/hive/warehouse/fw/test_fw
[root@cluster-node-1 ~]#
--目录已经删除掉,
此时发现文件还有数据,可能是数据在缓存里,我refresh下,发现数据继续存在,但是实际上此目录下文件已经被我删除了。
--先恢复文件,然后进行第二个实验:
--第二个实验,Truncate表:
我直接truncate表,此时文件肯定会被清除掉。
--然后我看看快照,发现历史文件还有
--第三个实验,Drop表:
快照和表都有数据文件
现在drop表,然后观察文件
然后看快照,发现表的目录虽然删除,但是快照有。
我先直接重建表,不转移恢复,然后再直接查询。
PS:
这个时候出现一个很神奇的错误。没有表,但是提示有表
那么就是imapla表删除了,但是hive元数据表还存在,两者不同步了。于是同步下。然后再看,发现表重新回来了。
尝试用快照修复,copy原有文件,包括location的目录。
此时表数据修复成功!
--第四个实验,表数据新增后,创建快照
新增数据后,再做一次快照,如下:
如上结果发现插入几次做快照后,其实就是全量备份。
经过如上测试和验证,得到如下:
- 如果某个目录开启了快照功能,则无法直接删除,只能删除其下文件以及子目录和子文件。
- 删除后,其实不影响查询,这个怀疑是hdfs可以从快照中读取数据,这样最大化降低文件删除对数据统计的影响。
- 只要做了快照后,哪怕表truncate和drop,数据也可以很快修复。
注意drop了需要从快照复制目录和文件,truncate不需要,只需要复制文件;
- 快照原理就是在指定目录下另外备份了一个,从而使得一般命令无法随意删除,除非有人恶意删除这个快照,否则不会丢失数据。当然数据存储空间要额外多一倍,这个是必不可少的。
5、后面可以写定时清理快照和创建快照的脚本,这样最大化减少数据丢失风险。
待验证,是否可以增量创建快照,减少存储空间,比如我每天新增10个文件,只增量快照10个,而不需要全部备份一次。
注意事项:
如果原始文件变动了,则只能全量备份。比如小文件合并后,只能全量做一次快照,否则没有意义。
后记:快照可以做成自动化脚本定时用crontab调度;
开启快照:
#使用ossuser登录hadoop
#在impala根目录开启快照功能
hdfs dfsadmin -allowSnapshot /encdata/impala
#在impala根目录创建一次快照
hadoop fs -createSnapshot /encdata/impala impala_backup_`date +%Y-%m-%d-%H`
设置定时调度:
#root用户下的定时任务设置
crontab -e
#在编辑器中添加
#每小时的第1分钟创建快照备份,快照操作不影响性能,只会占用比较大的磁盘空间
1 * * * * hadoop fs -createSnapshot /encdata/impala impala_backup_`date +\%Y-\%m-\%d-\%H`
#每小时的第15分钟删除上一个小时创建的快照备份,避免快照太多,占用空间太多
45 * * * * hadoop fs -deleteSnapshot /encdata/impala impala_backup_`date -d '-1 hour' +\%Y-\%m-\%d-\%H`
快照修复:
#查看快照,定期检查快照文件是否存在
hadoop fs -ls /encdata/impala/.snapshot
#恢复快照,yyyy-mm-dd-HH使用实际的目录时间
hadoop fs -mv /encdata/impala/.snapshot/impala_backup_yyyy-mm-dd-HH/storage /encdata/impala/storage