HDFS其他功能
一、不同集群之间的数据复制
在我们实际工作当中,极有可能会遇到将测试集群的数据拷贝到生产环境集群,或者将生产环境集群的数据拷贝到测试集群,那么就需要我们在多个集群之间进行数据的远程拷贝,hadoop自带也有命令可以帮我们实现这个功能。
二、集群内部文件拷贝scp
本地复制到远程
方式1:指定用户名,命令执行后需要再输入密码;
代码语言:javascript复制scp -r local_folder remote_username@remote_ip:remote_folder
方式2:没有指定用户名,命令执行后需要输入用户名和密码;
代码语言:javascript复制scp -r local_folder remote_ip:remote_folder
注意,如果实现了ssh免密登录之后,则不需要输入密码即可拷贝。
实例:
代码语言:javascript复制#复制文件-将 /root/test.txt 拷贝到 192.168.88.161 的 /root/ 目录下,文件名还是 text.txt,使用 root 用户,此时会提示输入远程 root 用户的密码。
scp /root/test.txt root@192.168.88.161:/root/
#复制文件并重命名-将 /root/test.txt 拷贝到 192.168.88.161 的 /root/ 目录下,文件名还是 text1.txt,使用 root 用户,此时会提示输入远程 root 用户的密码。
scp /root/test.txt root@192.168.88.161:/root/test1.txt
#复制目录-将整个目录 /root/test/ 复制到 192.168.88.161 的 /root/ 下,即递归的复制,使用 root 用户,此时会提示输入远程 root 用户的密码。
scp -r /root/test/ root@192.168.88.161:/root/
远程复制到本地
远程复制到本地 与 从本地复制到远程命令类似,不同的是 远程文件作为源文件在前,本地文件作为目标文件在后。
代码语言:javascript复制#复制文件-将192.168.88.162的/root目录下的test.txt拷贝到当前主机的/root/目录下,文件名不变
scp root@192.168.88.162:/root/test.txt /root/test.txt
三、跨集群之间的数据拷贝distcp
DistCp(distributed copy)是一款被用于大型集群间/集群内的复制工具,该命令的内部原理是MapReduce。
代码语言:javascript复制cd /export/servers/hadoop-2.7.5/
bin/hadoop distcp hdfs://node1:8020/jdk-8u241-linux-x64.tar.gz hdfs://cluster2:8020/
四、Archive档案的使用
HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。
Hadoop Archives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。
如何创建Archive
代码语言:javascript复制Usage: hadoop archive -archiveName name -p <parent> <src>* <dest>
其中-archiveName是指要创建的存档的名称。比如test.har,archive的名字的扩展名应该是*.har。 -p参数指定文件存档文件(src)的相对路径。
例如:如果你只想存档一个目录/config下的所有文件:
代码语言:javascript复制hadoop archive -archiveName test.har -p /config /outputdir
这样就会在/outputdir目录下创建一个名为test.har的存档文件。
如何查看Archive
首先我们来看下创建好的har文件。使用如下的命令:
代码语言:javascript复制hadoop fs -ls /outputdir/test.har
这里可以看到har文件包括:两个索引文件,多个part文件(本例只有一个)以及一个标识成功与否的文件。part文件是多个原文件的集合,根据index文件去找到原文件。
例如上述的/input目录下有很多小的xml文件。进行archive操作之后,这些小文件就归档到test.har里的part-0一个文件里。
代码语言:javascript复制hadoop fs -cat /outputdir/test.har/part-0
archive作为文件系统层暴露给外界。所以所有的fs shell命令都能在archive上运行,但是要使用不同的URI。Hadoop Archives的URI是:
har://scheme-hostname:port/archivepath/fileinarchive
scheme-hostname格式为hdfs-域名:端口,如果没有提供scheme-hostname,它会使用默认的文件系统。这种情况下URI是这种形式:
har:///archivepath/fileinarchive
如果用har uri去访问的话,索引、标识等文件就会隐藏起来,只显示创建档案之前的原文件:
查看归档文件中的小文件,使用har uri
代码语言:javascript复制hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har
查看归档文件中的小文件,不使用har uri
代码语言:javascript复制hadoop fs -ls har:///outputdir/test.har
查看har归档文件中小文件的内容
代码语言:javascript复制hadoop fs -cat har:///outputdir/test.har/core-site.xml
如何解压Archive
代码语言:javascript复制hadoop fs -mkdir /config2
hadoop fs -cp har:///outputdir/test.har/* /config2
查看HDFS页面,发现/config2目录中已经有解压后的小文件了
Archive注意事项
- Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。Hadoop archive的扩展名是*.har;
- 创建archives本质是运行一个Map/Reduce任务,所以应该在Hadoop集群上运行创建档案的命令,要提前启动Yarn集群;
- 创建archive文件要消耗和原文件一样多的硬盘空间;
- archive文件不支持压缩,尽管archive文件看起来像已经被压缩过;
- archive文件一旦创建就无法改变,要修改的话,需要创建新的archive文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日;
- 当创建archive时,源文件不会被更改或删除;
五、Snapshot快照的使用
快照顾名思义,就是相当于对hdfs文件系统做一个备份,可以通过快照对指定的文件夹设置备份,但是添加快照之后,并不会立即复制所有文件,而是指向同一个文件。当写入发生时,才会产生新文件。
HDFS 快照(HDFS Snapshots)是文件系统在某个时间点的只读副本。可以在文件系统的子树或整个文件系统上创建快照。快照的常见用途主要包括数据备份,防止用户误操作和容灾恢复。
快照使用基本语法
1、开启指定目录的快照功能
代码语言:javascript复制hdfs dfsadmin -allowSnapshot 路径
2、禁用指定目录的快照功能(默认就是禁用状态)
代码语言:javascript复制hdfs dfsadmin -disallowSnapshot 路径
3、给某个路径创建快照snapshot
代码语言:javascript复制hdfs dfs -createSnapshot 路径
4、指定快照名称进行创建快照snapshot
代码语言:javascript复制hdfs dfs -createSanpshot 路径 名称
5、给快照重新命名
代码语言:javascript复制hdfs dfs -renameSnapshot 路径 旧名称 新名称
6、列出当前用户所有可快照目录
代码语言:javascript复制hdfs lsSnapshottableDir
7、恢复快照
代码语言:javascript复制hdfs dfs -cp -ptopax 快照路径 恢复路径
8、删除快照snapshot
代码语言:javascript复制hdfs dfs -deleteSnapshot <path> <snapshotName>
快照操作实际案例
1、开启指定目录的快照
代码语言:javascript复制hdfs dfsadmin -allowSnapshot /config
2、对指定目录创建快照
注意:创建快照之前,先要允许该目录创建快照
代码语言:javascript复制hdfs dfs -createSnapshot /config
通过web浏览器访问快照
http://node1:50070/explorer.html#/config/.snapshot/
3、指定名称创建快照
代码语言:javascript复制hdfs dfs -createSnapshot /config mysnap1
4、重命名快照
代码语言:javascript复制hdfs dfs -renameSnapshot /config mysnap1 mysnap2
5、列出当前用户所有可以快照的目录
代码语言:javascript复制hdfs lsSnapshottableDir
6、恢复快照
代码语言:javascript复制hdfs dfs -cp -ptopax /config/.snapshot/mysnap1 /config3
7、删除快照
代码语言:javascript复制hdfs dfs -deleteSnapshot /config mysnap1
六、HDFS的Trash回收站功能
和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/current,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期,也就是当系统回收站中的文件/目录在一段时间之后没有被用户恢复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。
如果检查点已经启用,会定期使用时间戳重命名Current目录。.Trash中的文件在用户可配置的时间延迟后被永久删除。回收站中的文件和目录可以简单地通过将它们移动到.Trash目录之外的位置来恢复。
配置
HDFS的回收站就像Windows操作系统中的回收站一样。它的目的是防止你无意中删除某些东西。你可以通过设置如下属性来启用此功能(默认是不开启的):
代码语言:javascript复制<property>
<name>fs.trash.interval</name>
<value>10080</value>
<description>Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled.</description>
</property>
属性 | 说明 |
---|---|
fs.trash.interval | 分钟数,回收站文件的存活时间, 当超过这个分钟数后文件会被删除。如果为零,回收站功能将被禁用。 |
恢复回收站数据
代码语言:javascript复制hadoop fs -mv /user/root/.Trash/current/hadoop-env.sh /config
注意点
回收站功能默认是禁用的。对于生产环境,建议启用回收站功能以避免意外的删除操作。启用回收站提供了从用户操作删除或用户意外删除中恢复数据的机会。但是为fs.trash.interval设置合适的值也是非常重要的,以使垃圾回收以你期望的方式运作。例如,如果你需要经常从HDFS上传和删除文件,则可能需要将fs.trash.interval设置为较小的值。
当启用垃圾回收并删除一些文件时,HDFS容量不会增加,因为文件并未真正删除。
回收站功能默认只适用于使用Hadoop shell删除的文件和目录。使用其他接口(例如WebHDFS或Java API)以编程的方式删除的文件或目录不会移动到回收站,即使已启用回收站,除非程序已经实现了对回收站功能的调用。
有时你可能想要在删除文件时临时禁用回收站,也就是删除的文件或目录不用放在回收站而直接删除,在这种情况下,可以使用-skipTrash选项运行rm命令。例如:
代码语言:javascript复制hadoop fs -rm -skipTrash /dir1/a.txt