HDFS snapshot操作实战
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操作实战的更多相关文章
- 005-Scala数组操作实战详解
005-Scala数组操作实战详解 Worksheet的使用 交互式命令执行平台 记得每次要保存才会出相应的结果 数组的基本操作 数组的下标是从0开始和Tuple不同 缓冲数组ArrayBuffer( ...
- Hadoop之HDFS文件操作常有两种方式(转载)
摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- hadoop的hdfs文件操作实现上传文件到hdfs
这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...
- 用程序对hdfs进行操作。
调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中运行的. 运行命令Java -jar XXX.jar. 当中对hdfs的操作 ...
- 第二章:Python基础の快速认识基本数据类型和操作实战
本课主题 字符串和操作实战 二进制操作实战 List 列表和操作实战 Tuple 元組和操作实战 Dict 字典和操作实战 作業需求 引言 这遍文章简单介绍了 Python 字符串和集合的方法和应用, ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- 第四章:Python基础の快速认识內置函数和操作实战
本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...
- HDFS shell操作及HDFS Java API编程
HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...
- Hadoop---Java-API对HDFS的操作
Java-API对HDFS的操作 哈哈哈哈,深夜来一波干货哦!!! Java-PAI对hdfs的操作,首先我们建一个maven项目,我主要说,我们可以通过Java代码来对HDFS的具体信息的打印,然后 ...
随机推荐
- 在博文中嵌入Javascript代码
今天吃饭时无聊,突然想到Markdown除了兼容HTML会不会也兼容Javascript,于是博文里除了码文插音乐还可以干点更好玩的事儿了,可以自动修改markdown文件本身,比如说自动修改从Git ...
- PLSQL碰到pls-00103的错误解决办法
CREATE OR REPLACE PACKAGE PKG_SHOW_CUST_DETAILS AS PROCEDURE SHOW_CUST_DETAILS( myArg VARCHAR2);END ...
- ion-header-bar
ion-header-bar 指令声明一个标题栏元素,标题栏总是位于屏幕顶部 它有两个同级的可选属性 align-title:设置标题文字的对齐方式.允许值:left|right|center no- ...
- Android添加快捷方式
private void addShortcutToDesktop() { Intent shortcut = new Intent("com.android.launcher.action ...
- C#连接数据库SQL,并转换成list形式
web config 配置 <connectionStrings> <add name="SQLConnString" connectionString=& ...
- JDBC删除表数据
delete 必须使用where 条件指定删除哪一行数据.通常用具有唯一性的主键进行标示. package qddx.JDBC; import java.sql.*; public class Del ...
- python 模拟用户登录代码
需求:输入用户名,判断用户是否被锁定,锁定则退出,否则进入密码验证,输入三次错误密码之后此用户被锁定. userlist.txt里,用":"将用户名.密码.状态码分开: [root ...
- Find Median from Data Stream
常规方法 超时 class MedianFinder { vector<int> coll; public: MedianFinder(){ } void heapfu(vector< ...
- [原创]cocos2d-x研习录-第三阶 特性之物理引擎
游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...
- Python核心编程练习题笔记: type(a)==type(b) 和 type(a) is type(b)的差别
前式需要找到类型的ID(相当于门牌号),然后“敲门”取得类型值 后式只需要找到类型的ID,而不需要再去“敲门”获得类型具体值.在一个“门牌号”内只可能有一个值,因此就不用明知故问了.因此后式比前式少了 ...