Hadoop从2.1.0版开始提供了HDFS SnapShot的功能。一个snapshot(快照)是一个全部文件系统、或者某个目录在某一时刻的镜像。快照在下面场景下是非常有用:
防止用户的错误操作:管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行回复。
备份:管理员可以根据需求来备份整个文件系统,一个目录或者单一一个文件。管理员设置一个只读快照,并使用这个快照作为整个全量备份的开始点。增量备份可以通过比较两个快照的差异来产生。
试验/测试: 一个用户当想要在数据集上测试一个应用程序。一般情况下,如果不做该数据集的全量拷贝,测试应用程序会覆盖/损坏原来的生产数据集,这是非常危险的。管理员可以为用户设置一个生产数据集的快照(Read write)用于用户测试使用。在快照上的改变不会影响原有数据集。
灾难恢复:只读快照可以被用于创建一个一致的时间点镜像用于拷贝到远程站点作灾备冗余。
通过下面命令对某一个路径(根目录/,某一目录或者文件)开启快照功能,那么该目录就成为了一个snapshottable的目录。snapshottable下存储的snapshots 最多为65535个,保存在该目录的.snapshot下。

 
1
2
hdfs dfsadmin -allowSnapshot /user/spark
Allowing snaphot on /user/spark succeeded

下面创建一个snapshot,命令格式为hdfs dfs -createSnapsshot [snapshot names]

 
1
2
hdfs dfs -createSnapshot /user/spark s0
Created snapshot /user/spark/.snapshot/s0

该快照会被立即创建出来,创建动作仅仅是在目录对应的Inode上加个快照的标签,因为此时快照目录里不包含任何实际数据。不同的快照间采用硬链接的方式,引用相同的数据块,所以也不会涉及到数据块的拷贝操作。而对文件的删除和追加,快照中的块将会的指向所作的修改的块,所以也不会对读写性能有影响,但是会占用namenode一定的额外内存来存放快照中被修改的文件和目录的元信息。参考:大数据实践:通过Snapshot对HDFS文件系统进行备份

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#创建f1,f2,f3三个文件
hdfs dfs -touchz /user/spark/tmp/f{1,2,3}
#新建快照s1
hdfs dfs -createSnapshot /user/spark s1
Created snapshot /user/spark/.snapshot/s1
#此时当前文件系统和s1中都包含f1,f2,f3三个文件
hdfs dfs -ls -R /user/spark
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp/f1
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp/f2
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp/f3
#删除f3
hdfs dfs -rm /user/spark/tmp/f3
14/12/20 10:46:09 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://hdp01:8020/user/spark/tmp/f3' to trash at: hdfs://hdp01:8020/user/hdfs/.Trash/Current
#查看快照内容,可以发现当前文件系统已经没有f3,而快照s1还有f3文件存在。这样,通过拷贝s1下的f3文件就可以进行恢复。
hdfs dfs -ls -R /user/spark/.snapshot
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:28 /user/spark/.snapshot/s0
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s0/tmp
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1/tmp
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1/tmp/f1
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1/tmp/f2
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1/tmp/f3
hdfs dfs -ls -R /user/spark/
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:46 /user/spark/tmp
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp/f1
-rw-r--r--   3 hdfs supergroup          0 2014-12-20 10:45 /user/spark/tmp/f2
#RO的快照不能被修改,目前还没有找到RW的实现方法=。=
hdfs dfs -touchz /user/spark/.snapshot/s1/f4
touchz: Modification on a read-only snapshot is disallowed

此外,另外几个常用的命令:
(1). 修改snapshot名称: hdfs dfs -renameSnapshot 
例如:将s0修改为s_init

 
1
2
3
4
5
hdfs dfs -renameSnapshot /user/spark s0 s_init
hdfs dfs -ls /user/spark/.snapshot
Found 2 items
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:45 /user/spark/.snapshot/s1
drwxr-xr-x   - hdfs supergroup          0 2014-12-20 10:28 /user/spark/.snapshot/s_init

(2). 通过hdfs lsSnapshottableDir 来列出snapshottable的目录

 
1
2
hdfs lsSnapshottableDir
drwxr-xr-x 0 hdfs supergroup 0 2014-12-20 10:45 2 65536 /user/spark

(3). 比较两个快照之间的差异:hdfs snapshotDiff

 
1
2
3
4
5
6
hdfs snapshotDiff /user/spark s_init s1
Difference between snapshot s_init and snapshot s1 under directory /user/spark:
M ./tmp
+ ./tmp/f1
+ ./tmp/f2
+ ./tmp/f3

(4). 删除快照:hdfs dfs -deleteSnaphost

 
1
hdfs dfs -deleteSnapshot  /user/spark s_init

(5). 关闭 Snapsshots: hdfs dfsadmin -disallowSnapshot

 
1
hdfs dfsadmin -disallowSnapshot /user/spark

通过Snapshot可以按照定时任务,按固定时间间隔(例如每天)的方式创建文件快照,并删除过期的文件快照,减少业务误操作造成的数据损失。快照的操作远低于外部备份开销,可作为我们备份HDFS系统最常用的方式。

HDFS snapshot操作实战的更多相关文章

  1. 005-Scala数组操作实战详解

    005-Scala数组操作实战详解 Worksheet的使用 交互式命令执行平台 记得每次要保存才会出相应的结果 数组的基本操作 数组的下标是从0开始和Tuple不同 缓冲数组ArrayBuffer( ...

  2. Hadoop之HDFS文件操作常有两种方式(转载)

    摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  3. hadoop的hdfs文件操作实现上传文件到hdfs

    这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...

  4. 用程序对hdfs进行操作。

    调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中运行的. 运行命令Java -jar  XXX.jar. 当中对hdfs的操作 ...

  5. 第二章:Python基础の快速认识基本数据类型和操作实战

    本课主题 字符串和操作实战 二进制操作实战 List 列表和操作实战 Tuple 元組和操作实战 Dict 字典和操作实战 作業需求 引言 这遍文章简单介绍了 Python 字符串和集合的方法和应用, ...

  6. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  7. 第四章:Python基础の快速认识內置函数和操作实战

    本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...

  8. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

  9. Hadoop---Java-API对HDFS的操作

    Java-API对HDFS的操作 哈哈哈哈,深夜来一波干货哦!!! Java-PAI对hdfs的操作,首先我们建一个maven项目,我主要说,我们可以通过Java代码来对HDFS的具体信息的打印,然后 ...

随机推荐

  1. jquery 操作

    Jquery使用时要引用,引用时放在最前. Jquery: $代表选择器, $(document) ready(function(e){}):找到页面,页面加载完成后执行. JS选取元素操作内容操作属 ...

  2. Oracle导出表(即DMP文件)的两种方法

    转载:http://blog.csdn.net/lanpy88/article/details/7580691   方法一:利用PL/SQL Developer工具导出: 菜单栏---->Too ...

  3. 使用SqlLocalDB命令行管理LocalDB

    SqlLocalDB.exe start v11.0 SqlLocalDB.exe info v11.0 SQL Server Management Stdio添加管道连接实例 默认实例名(local ...

  4. AIX上通过IPSEC进行IP包过滤

    AIX上的IPSEC 在AIX可以通过以下步骤打开IP Security smitty ipsec4 --> Start/Stop IP Security --> Start IP Sec ...

  5. [转] LBYL与EAFP两种防御性编程风格

    检查数据可以让程序更健壮,用术语来说就是防御性编程.检查数据的时候,有这样的两种不同的风格.LBYL:Look Before You Leap  EAFP:Easier to Ask Forgiven ...

  6. rails使用bootstrap3-wysiwyg可视化编辑器并实现自定义图片上传插入功能

    之前在rails开发中使用了ckeditor作为可视化编辑器,不过感觉ckeditor过于庞大,有很多不需要的功能,而且图片上传功能不好控制不同用户可以互相删除图片,感觉很不好.于是考虑更改可视化编辑 ...

  7. CE取系统时间值

    取时间值: void GetTime() { //取时间值 SYSTEMTIME st = {}; // 时间结构体 GetLocalTime(&st); // 把获取的系统时间信息存储到SY ...

  8. Kali Linux additional tools setup

    The steps are pretty straight forward. The only tool that might cause some confusion is SMBexec. Thi ...

  9. 简单的 JSON 对象进行深拷贝最简单的方法

    var json = { a: 123, b: '456' }; var json2 = JSON.parse(JSON.stringify(json)); 只需要先使用 JSON.stringify ...

  10. yum常用命令

    Yum list kmod-coretemp[查找kmod-coretemp模块状态] Yum clean all[清空yum缓存] Yum remove kmod-coretemp [卸载kmod- ...