hadoop实验3

实验环境

CentOS7

Hadoop-3.2.1

JDK1.8

Windows10

3.1 读取HDFS文件内容

一、实验目的

1、理解HDFS原理。

2、了解HDFS读取文件方式。

3、掌握通过编写代码运行读取HDFS文件流程。

二、实验内容

本次实验首先了解HDFS的概念原理,进而学习HDFS文件读取的原理,然后实战通过编程运行读取HDFS文件。

假装这里有代码块(代码块没法嵌套代码块)

三、准备知识

准备知识

随着数据量越来越大, 在 一个操作系统管辖的范围存不下了, 那么就 分配到更多的操作系统管理的磁盘中, 但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。

HDFS的基本结构:

NameNode :管理文件目录结构,接受用户的操作请求,是管理数据节点的。名字节点维护两套数据, 一套是文件目录与数据块之间的关系 , 另一套是数据块与节点之间的关系 。前一套数据是静态的,是存放在磁盘上的, 通过fsimage和edits文件来维护;后一套数据是动态的,不持久放到到磁盘的,每当集群启动的时候,会自动建立这些信息,所以一般都放在内存中。

DataNode:是HDFS中真正存储数据的节点。

四、实验步骤

1.启动Hadoop,在/export/data/hadoop目录下使用如下命令建立input目录:

1
2
3
4
5
6
7
8
9
start-all.sh

xcall jps

cd /export/data/hadoop

mkdir input

ll

image-20230925150214521

image-20230925150146143

2.进入/export/data/hadoop/input/目录,在该目录中建立quangle.txt文件

1
2
3
cd /export/data/hadoop/input/

vi quangle.txt

添加下列内容

1
2
3
4
5
6
7
on the top of the Crumpetty Tree

The Quangle Wangle sat,

But his face could not see,

On account of his Beaver Hat.

3.使用如下命令在hdfs中建立/usr/hadoop/文件夹

1
2
3
hadoop fs -mkdir -p /usr/hadoop/

hadoop fs -ls /usr/

image-20230925162959302

4.把quangle.txt文件上传到HDFS的/usr/hadoop/文件夹中

1
2
3
hadoop fs -put quangle.txt /usr/hadoop/

hadoop fs -ls /usr/hadoop

image-20230925163050301

5.打开IDEA,选择hadoopReadWrite项目

IMG_256

6.弹出窗口中选择hadoopReadWrite项目

IMG_257

7.创建FileSystemCat类,弹出窗口中输入com.xunfang.FileSystemCat,敲击回车

IMG_256

IMG_257

8.输入下列代码

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
32
33
34
35
36
37
38
39
40
41
42
package com.xunfang;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import java.io.InputStream;

import java.net.URI;

public class FileSystemCat {

public static void main(String[] args) throws Exception {

String uri = args[0];//文件位于HDFS上的路径

Configuration conf = new Configuration();//获取环境变量

FileSystem fs = FileSystem.get(URI.create(uri), conf);//创建文件系统实例对象fs

InputStream in = null;

try {

in = fs.open(new Path(uri));

IOUtils.copyBytes(in, System.out, 4096, false);

} finally {

IOUtils.closeStream(in);

}

}

}

img

imgimg

9.打包之前确定目录中没有target文件,如果有点击clean将其清除

IMG_256

10.点击package进行打包

img

11.拷贝jar包

IMG_258

将jar包粘贴至桌面,将鼠标指向桌面右键粘贴即可,效果图如下

img

12.将jar包上传至服务器使用集群运行

可以使用Xshell工具上传jar包到master节点(前提是master主机开机了)

1
2
3
su root

cd /export/data/hadoop/data/

但是这里注意,实验二的jar包(和实验三生成的jar包同名)也在里面,要先进行删除,不然会报错

img

然后再把包拖进去

img

然后把xshell关掉,去虚拟机上查看一下

img

启动Hadoop,在jar包当前路径下运行jar包(cd /export/data/hadoop/data好像是这个吧)

1
hadoop jar hadoopReadWrite-1.0-SNAPSHOT.jar com.xunfang.FileSystemCat /usr/hadoop/quangel.txt

img

14.关闭集群

1
stop-all.sh

五、实验总结

该实验实际操作hadoop编译代码读取hdfs文件,对hdfs文件的目录结构,Java代码的编译有较为明确的了解。

3.2 读取HDFS文件内容

一、实验目的

1、理解HDFS原理。

2、了解HDFS读取文件方式。

3、掌握通过编写代码运行读取HDFS文件流程。

二、实验内容

本次实验首先了解HDFS的概念原理,进而学习HDFS文件读取的原理,然后实战通过编程运行读取HDFS文件。

三、准备知识

准备知识

HDFS客户端可以通过java API的方式对HDFS进行读写操作,FileSystem fs = FileSystem.get(new URI(“hdfs://ns1”), new Configuration(),“root”);客户端通过调用FileSystem对象fs的Open()方法打开要读取的文件,DistributedFileSystem通过使用RPC来调用NameNode,以确定文件起始块的位置。

对于文件的每一个块,NameNode返回存有该块副本的DataNode地址。这些DataNode根据它们与客户端的距离来排序(根据集群中的网络拓扑)。如果该客户端本身就是一个DataNode(例如在一个MapReduce任务中)并保存有相应数据块的一个副本时,该节点就会从本地DataNode读取数据。然后DistributedFileSystem返回一个FSDataInputStream对象(支持文件定位的输入流)给客户端读取数据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着DataNode和NameNode的I/O。

四、实验步骤

1.打开IDEA,选择hadoopReadWrite项目

IMG_256

2.弹出窗口中选择hadoopReadWrite项目

IMG_257

3.创建HdfsFile类,弹出窗口中输入com.xunfang.HdfsFile,敲击回车

IMG_256

IMG_257

3.输入下列代码

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.xunfang;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;


import java.io.FileOutputStream;

import java.io.OutputStream;

import java.net.URI;

public class HdfsFile {

public static void main(String[] args) throws Exception {

String uri = args[0];

String local = args[1];


FSDataInputStream in = null;

OutputStream out = null;

Configuration conf = new Configuration();

{

FileSystem fs = FileSystem.get(URI.create(uri), conf);

in = fs.open(new Path(uri));

out = new FileOutputStream(local);

byte[] buffer = new byte[20];

in.skip(100);

int byteRead = in.read(buffer);

if (byteRead >= 0) {

out.write(buffer, 0, byteRead);

}

}

{

//关闭打开的流

IOUtils.closeStream(in);

IOUtils.closeStream(out);

}

}

}

img

4.打包之前确定目录中没有target文件,如果有点击clean将其清除

IMG_256

5.点击package进行打包

img

6.拷贝jar包

IMG_258

将jar包粘贴至桌面,将鼠标指向桌面右键粘贴即可,效果图如下

img

7.将jar包上传至服务器

可以使用Xshell工具上传jar包到master节点(前提是master主机开机了)

1
2
3
su root

cd /export/data/hadoop/data/

但是这里注意,前几个实验的jar包(和实验三生成的jar包同名)也在里面,要先进行删除,不然会报错

img

然后再把包拖进去

img

然后把xshell关掉,去虚拟机上查看一下

img

8.建立测试文件,进入/export/data/hadoop/input/目录,在该目录中建立hdfslocal.txt文件

1
2
3
cd /export/data/hadoop/input/

vi hdfslocal.txt

输入下面中的文字(as,yyds)

1
as you said, the CLASSPATH you need depends on version.location, and type of installation.How to install it is a separate discussion,b ut assuming you have a proper hadoop setup installed, it's easy { though I adnit,I have no clue where it is documented).Thanks! opefully this will help anyone else who is having trouble.Everything I was reading was giving specific directions on where the files were locate d.but this solution will help people no matter how they have it installed!

img

9.启动Hadoop,把该文件上传到hdfs的/usr/hadoop/文件夹中

1
2
3
4
5
cd /export/data/hadoop/input/

hadoop fs -put hdfslocal.txt /usr/hadoop/

hadoop fs -ls /usr/hadoop

img

10.在jar包当前路径下运行jar包(cd /export/data/hadoop/data好像是这个吧)

1
hadoop jar hadoopReadWrite-1.0-SNAPSHOT.jar com.xunfang.HdfsFile /usr/hadoop/hdfslocal.txt hdfslocal_part.txt

11.检验输出文件

1
2
3
ll

cat hdfslocal_part.txt

img

12.退出集群

1
stop-all.sh

五、实验总结

该实验实际操作hadoop编译代码读取hdfs文件,对hdfs文件的目录结构,Java代码的编译有较为明确的了解。

3.3 fsck块检查操作

一、实验目的

了解HDFS fsck 的基本工作原理,掌握fsck块检查命令的基本操作。

二、实验内容

1、了解HDFS fsck的基本工作原理。

2、了解并掌握HDFS fsck块检查命令的基本操作

三、准备知识

准备知识

HDFS fsck

HDFS支持fsck命令检查各种不一致,它主要是用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。它的设计目的是报告各种文件的问题,例如,文件丢失的块或未复制的块。与传统的本地文件系统的fsck实用程序不同,该命令不纠正它检测到的错误。通常,NameNode会自动纠正大多数可恢复的故障。默认情况下,fsck忽略打开的文件,但提供了在报告期间选择所有文件的选项。HDFS fsck命令不是Hadoop shell命令。它可以运行为bin/hdfs fsck。fsck可以在整个文件系统上运行,也可以在文件的子集上运行。

执行fsck命令行的客户端必选在hadoop-site.xml中配置dfs.http.address项,即namenode的http地址。否则会抛出java.net.ConnectException: Connection refused异常。
Fsck本质上是namenode的一个servlet,而fsck命令对应的类DFSck其实是封装了一个http连接,请求NamenodeFsck对象并执行起fsck()函数,fack()函数递归地从指定path遍历所有的目录和文件,并根据选项确定要打印的内容。如果指定了-move选项,则损坏的文件会被移动到/lost+found目录,如果在根目录下已经存在一个名为lost+found的文件,则move操作会失败并打印warning信息。

Fsck过程的调用指的是从终端机器输入到最终fsck在HDFS内部被执行的整个过程。

IMG_256

规划后的中间流程:

1.输入fsck 直接调用到的就是此类。DFSck内部会发送http请求的方式,根据参数构造URL请求地址,发送到下一个处理对象中。

2.下一个处理对象就是FsckServlet.FsckServlet在这里相当于一个过渡者,马上调用真正操作类NamenodeFsck.。

3.NamenodeFsck在这里会取出请求参数,然后在HDFS内部做真正的fsck检测操作。
DFSck请求构造:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public int run(final String[] args) throws IOException {

if (args.length == 0) {

printUsage(System.err);

return -1;

}

try {

return UserGroupInformation.getCurrentUser()

.doAs(new PrivilegedExceptionAction<Integer>() {

@Override

public Integer run() throws Exception {

return doWork(args);

}

});

} catch (InterruptedException e) {

throw new IOException(e);

}

}

// URL构造完毕后,并发送请求

URL path = new URL(url.toString());

URLConnection connection;

try

{

connection = connectionFactory.openConnection(path, isSpnegoEnabled);

}catch(
AuthenticationException e)

{

throw new IOException(e);

}

// 获取响应回复,直接输出到终端上

InputStream stream = connection.getInputStream();

BufferedReader input = new BufferedReader(new InputStreamReader(stream, "UTF-8"));

String line = null;

String lastLine = null;

int errCode = -1;

try

{

while ((line = input.readLine()) != null) {

out.println(line);

lastLine = line;

}

}finally

{

input.close();

}

fsck命令执行的基本流程架构如下图所示:

IMG_257

注:对于大的集群来说,对根目录执行fsck操作是很耗时间的而且对namenode压力很大,因此要谨慎使用。

四、实验步骤

fsck的参数与语法

l HDFS fsck命令参数说明

参数名 作用
检查这个目录中的文件是否完整
-move 破损的文件移至/lost+found目录
-delete 删除破损的文件
-openforwrite 打印正在打开写操作的文件
-files 打印正在check的文件名
-blocks 打印block报告 (与-files一起使用)
-locations 打印每个block的位置信息(与-files一起使用)
-racks 打印位置信息的网络拓扑图 (与-files一起使用)

4.HDFS fsck 基本语法

1
Usage: fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

(二)FSCK的基本操作(在开启Hadoop****情况下)

1.检查集群文件系统健康状况:

1
hdfs fsck /

img

2.检查文件的详细Block信息

1
hdfs fsck /usr/hadoop/quangle.txt -files -racks

img

1
hdfs fsck /usr/hadoop/quangle.txt -files -blocks -locations -racks

img

img

五、实验总结

通过本次实验,了解掌握了HDFS fsck的基本原理,掌握了hdfs fsck命令的详细使用方法,了解掌握了fsck的基本作用于应用场景。

3.4 文件系统权限配置与操作

一、实验目的

了解HDFS 文件系统的基本模型与原理,了解并掌握HDFS文件系统相关的配置,了解并掌握HDFS文件系统的基本操作。

二、实验内容

1、了解HDFS文件系统的基本模型与原理

2、了解并掌握HDFS文件系统的权限相关配置

3、了解并掌握HDFS文件系统的权限相关操作

三、准备知识

准备知识

(一)HDFS权限管理模型

1.概述

Hadoop分布式文件系统实现了一个和POSIX系统类似的文件和目录的权限模型。每个文件和目录有一个所有者(owner)和一个组(group)。文件或目录对其所有者、同组的其他用户以及所有其他用户分别有着不同的权限。对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有w权限,当访问目录的子节点时需要有x权限。不同于POSIX模型,HDFS权限模型中的文件没有sticky,setuid或setgid位,因为这里没有可执行文件的概念。为了简单起见,这里也没有目录的sticky,setuid或setgid位。总的来说,文件或目录的权限就是它的模式(mode)。HDFS采用了Unix表示和显示模式的习惯,包括使用八进制数来表示权限。当新建一个文件或目录,它的所有者即客户进程的用户,它的所属组是父目录的组(BSD的规定)。

每个访问HDFS的用户进程的标识分为两个部分,分别是用户名和组名列表。每次用户进程访问一个文件或目录foo,HDFS都要对其进行权限检查。

5.如果用户即foo的所有者,则检查所有者的访问权限;

6.如果foo关联的组在组名列表中出现,则检查组用户的访问权限;

7.否则检查foo其他用户的访问权限。

如果权限检查失败,则用户的操作会失败。

2.用户

在Hadoop中支持两种方式验证用户的身份,具体由hadoo.security.authentication参数决定,具体配置参数配置如下:

simple客户端的身份标志由宿主系统决定,即用户的身份即进程所在的系统的身份
kerberos客户端的身份标志由Kerberos凭证决定

无论操作的方式如何,用户身份机制都是由HDFS本身所构成的。在HDFS中没有提供用于创建用户标识、建立组或处理用户凭证的规定。

3.组映射

当用户名确定时,组的列表由hadoop.security.group属性和group mapping服务来管理。用户组关系映射的管理实现有以下几种情况:

8.当节点的JNI服务可用时,它的默认实现是org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback,它通过hadoop的默认API来实现用户组关系的映射。

9.当JNI不可用时,默认实现为org.apache.hadoop.security.ShellBasedUnixGroupsMapping,Shell实现用bash –c命令来解析用户组映射表。

10.使用LDAP服务器来管理用户组关系映射,通过org.apache.hadoop.security.LdapGroupsMapping提供具体实现,但是,如果需要的组只驻留在LDAP中,并且没有在Unix服务器上实现,那么这个提供者只应该被使用。关于配置组映射服务的更多信息可以在Javadocs中找到。

对于HDFS,在NameNode上执行用户到组的映射。因此,NameNode的主机系统配置决定了用户的组映射。注意,HDFS将文件或目录的用户和组存储为字符串;在Unix中,用户和组的标识号没有转换。

每个文件或目录操作将完整的路径名传递给名称节点,并在每个操作的路径上应用权限检查。客户端框架将隐式地将用户标识与名称节点的连接关联起来,从而减少对现有客户端API的更改的需求。一直以来,当一个文件的操作成功时,操作可能会失败,因为文件或路径上的某个目录不再存在。例如,当客户端开始读取一个文件时,它会向name节点发出第一个请求,以发现文件的第一个块的位置。另一个请求可能会失败。另一方面,删除一个文件并不会撤销已经知道文件块的客户机的访问权限。随着权限的增加,客户端对文件的访问可能会在请求之间撤销。再次,更改权限不会撤销已经知道文件块的客户机的访问权限。

public FSDataOutputStream create(Path f, FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, Progressable progress)

public boolean mkdirs(Path f, FsPermission permission)

public void setPermission(Path p, FsPermission permission)

public void setOwner(Path p, String username, String groupname)

public FileStatus getFileStatus(Path f)

新文件或目录的模式限制了我的umask设置作为配置参数。当现有的创建(目录,…)方法使用(不允许参数),新文件的模式是0666 & ^ umask。当使用新的create(path, permission,…)方法(使用权限参数P)时,新文件的模式是P & umask & 0666。当使用现有的mkdirs(path)方法创建新目录时(没有权限参数),新目录的模式是0777 & umask。当使用新的mkdirs(path, permission)方法(使用权限参数P)时,新目录的模式是P & umask & 0777。

四、实验步骤

(一)HDFS Shell权限操作

参数

chmod [-R] mode file 只有文件的所有者或超级用户才允许更改文件的模式。
chgrp [-R] group file 调用chgrp的用户必须属于指定的组,并且是文件的所有者,或者是超级用户。
chown [-R] [owner][:[group]] file 文件的所有者只能由超级用户修改。
ls file 显示目录下所有文件
lsr file 输出结果被格式化,会显示所有者、组和模式。
chmod [-R] mode file 只有文件的所有者或超级用户才允许更改文件的模式。

1.启动hadoop,如果已启动就不需要进行该操作

1
start-all.sh

2.创建测试文件

1
2
3
4
5
mkdir /root/data/

cd /root/data

vi test

将下列内容添加到文件内部

1
hadoop hdfs yarn mapreduce bigdata

IMG_256

3.上传文件,并查看

1
2
3
4
5
hdfs dfs -mkdir -p /root/data

hdfs dfs -put test /root/data/

hdfs dfs -ls /root/data/

img

4.显示文件当前权限信息(红框内即是权限信息)

1
hdfs dfs -ls /root/

img

5.修改文件的权限信息,并查看

1
2
3
hdfs dfs -chmod 777 /root/data

hdfs dfs -ls /root/

img

6.查看文件所有者

1
hdfs dfs -ls /root/data

img

root为所有者,supergroup为所有组

7.修改文件的所有者,并查看

1
2
3
hdfs dfs -chown hadoop:hadoop /root/data/test

hdfs dfs -ls /root/data

img

五、实验总结

通过本次实验,了解掌握了HDFS 权限控制的基本管理,掌握了如何使用Shell操作使用HDFS进行权限控制,了解并掌握使用JavaAPI进行HDFS文件系统的权限管理。

3.5 Snapshots的基本操作

一、实验目的

通过对HDFS Snapshots的基本实现原理的分析,了解并掌握HDFS Snapshots的基本原理,进行相关的基本操作

二、实验内容

1、HDFS Snapshots的基本原理

2、HDFS Snapshots的基本操作

三、准备知识

准备知识

(一)快照Snapshots

1.快照技术

在计算机系统中,快照是系统在特定时间点的状态。这个词是在摄影中被创造出来的。它可以引用系统状态的实际副本,也可以指某些系统提供的功能。

一个大型数据集的完整备份可能需要很长时间才能完成。在多任务或多用户系统中,当数据被备份时,可能会写入数据。这将防止备份成为原子,并引入可能导致数据损坏的版本倾斜。例如,如果用户将文件移动到已经备份的目录中,那么该文件将完全丢失在备份媒体上,因为在添加文件之前已经进行了备份操作。版本倾斜也可能导致文件的损坏,这些文件在读取时改变其大小或内容。

安全备份实时数据的一种方法是,在备份期间暂时禁用对数据的写入访问,或者通过停止访问应用程序,或者使用操作系统提供的锁定API来强制执行独占读取访问。这对于低可用性系统(在桌面计算机和小型工作组服务器上是可以接受的)是可以容忍的。然而,高可用性24/7系统无法承载服务中断。

为了避免停机,高可用性系统可能会在快照上执行备份——在时间点上冻结的数据集的只读副本,并允许应用程序继续写入数据。大多数快照实现都是高效的,并且可以在O(1)中创建快照。换句话说,创建快照所需的时间和I/O不会随着数据集的大小而增加;相比之下,直接备份所需的时间和I / O数据集的大小成正比。在一些系统一旦最初的快照的一个数据集,后续快照复制更改的数据,并使用一个指针引用系统初始快照。与重复克隆数据集相比,这种基于指针的快照方法消耗的磁盘容量更少。

快照的技术类型:

8.基于文件系统的快照

9.基于LVM(逻辑卷管理器)的快照

10.基于NAS的快照

11.基于磁盘阵列的快照

12.基于存储虚拟化设备的快照

13.基于主机虚拟化软件的快照

14.基于数据库的快照

(二)HDFS快照

1.概述

快照snapshots是HDFS文件系统的只读的基于某时间点的拷贝,可以针对某个目录,或者整个文件系统做快照。

快照比较常见的应用场景是:

15.数据备份

16.防止用户误操作

17.进行试验或测试

18.灾难恢复

快照存在两种类型:Read-only (RO) snapshots只读快照,Read-write (RW) snapshots可读写快照

快照的高效性实现:

(1) 快照可以即时创建,耗时仅为O(1),减少了inode查找时间。

(2) 只有当涉及到快照目录的修改被执行时,才会产生额外的内存消耗。而且内存消耗为O(M),其中M是被修改的文件或目录数。

(3) 创建快照时,block块并不会被拷贝。快照文件中只记录了block列表和文件大小,不会做任何数据拷贝。

(4) 快照不会对正常的HDFS操作有任何影响:创建快照以后发生的修改操作,被按操作时间的倒序(from newer to older)记录下来。所以当前的数据能被直接获取,而快照点的数据,则通过在当前的数据基础上减去执行过的操作来获取。

注:更新快照的时间间隔越长,快照所需的开销越大,耗时越久。

2.HDFS中快照的两种方式

19.NameNode与DataNode都做快照,快照保存在DataNode中,DataNode负责管理

20.仅NameNode做快照,由NameNode管理

3.快照目录

我们可以在任何被设置为snapshottable的目录上执行快照,对一个目录最多可以创建65536个快照。管理员可以把任何目录设置为snapshottable,没有限制。如果一个目录下已经存在快照,那么只有当先删除所有快照后才能对这个目录进行删除和重命名等操作。
不允许嵌套的snapshottable目录。也就是说,如果一个目录被设置为snapshottable,那么它的父目录和子目录都不允许被设置为snapshottable。

4.快照路径

快照被存放在一个被命名为.snapshot的目录中。比如/foo是一个snapshottable目录,/foo中有一个目录为/foo/bar,对/foo创建一个快照s0。那么/foo/.snapshot/s0/bar就是/foo/bar目录对应的快照。可以通过”.snapshot”路径直接访问和操作快照数据。

四、实验步骤

(一)启动快照(Snapshots)功能

1.启动集群(集群已启动就不需要输入下列命令)

1
start-all.sh

2.创建快照存放路径并启动快照功能

1
2
3
hadoop fs -mkdir /foo

hdfs dfsadmin -allowSnapshot /foo

img

(二)创建快照

3.查看HDFS的目录

img

多余的目录使用下述命令删除

1
hadoop fs -rm -r -f hdfs上路径

img

4.创建快照s0(并没有保存任何文件)

img

5.创建f1,f2,f3三个文件,并查看

1
2
3
4
5
hadoop fs -mkdir /foo/tmp

hadoop fs -touchz /foo/tmp/f{1,2,3}

hadoop fs -ls /foo/tmp

img

6.创建快照(此时当前文件系统和s快照中都包含f1,f2,f3三个文件)

1
hdfs dfs -createSnapshot /foo s1

img

(三)快照测试

7.删除f3文件

1
hadoop fs -rm /foo/tmp/f3

8.查看快照内容,可以发现当前文件系统已经没有f3,而快照s1还有f3文件存在。

1
2
3
hdfs dfs -ls -R /foo/.snapshot

hdfs dfs -ls -R /foo/tmp

img

9.使用快照恢复文件并查看

1
2
3
hdfs dfs -cp /foo/.snapshot/s1/tmp/f3 /foo/tmp

hadoop fs -ls /foo/tmp

img

(四)快照的其他操作

10.修改快照的名称

1
2
3
4
5
hadoop fs -ls /foo/.snapshot/

hadoop fs -renameSnapshot /foo s0 s100

hadoop fs -ls /foo/.snapshot/

img

11.列出快照存放路径

1
hdfs lsSnapshottableDir

img

12.比较两个快照之间的差异

1
2
3
4
5
6
7
hdfs snapshotDiff /foo/ s1 s100

hdfs snapshotDiff /foo/ s100 s1

hadoop fs -ls /foo/.snapshot/s1/

hadoop fs -ls /foo/.snapshot/s100/

img

13.删除快照

1
2
3
hdfs dfs -deleteSnapshot /foo s100

hadoop fs -ls /foo/.snapshot/

img

14.关闭快照功能(使用此命令必须将路径下存在的所有快照都删除)

1
2
3
4
5
hdfs dfsadmin -disallowSnapshot /foo

hdfs dfs -deleteSnapshot /foo s1

hdfs dfsadmin -disallowSnapshot /foo

img

15.实验关闭快照功能后是否还可以创建快照

1
2
3
hdfs dfs -createSnapshot /foo /s2

hadoop fs -ls /foo/.snapshot/

img