date: 2021-01-03title: HDFS之归档、回收站、快照管理 #标题
tags: Hadoopp#标签
categories: Hadoop # 分类
小文件归档
HDFS存储小文件弊端
HDFS中,每个文件均按照块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效,因为因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如:一个1MB的文件设置为128M的块存储,实际使用的是1MB的磁盘空间,而不是128M。
解决存储小文件办法之一
HDFS存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体来说,HDFS存档文件对内还是一个一个独立文件,但对于NameNode而言却是一个整理,由此减少NameNode的内存使用。具体示意图如下:
创建归档
# 上传小文件用于测试
$ hadoop fs -mkdir -p /test/input
$ hadoop fs -put host.conf /test/input/
$ hadoop fs -put hosts /test/input/
$ hadoop fs -put hostname /test/input/
$ hadoop fs -put hosts.allow /test/input/
# hadoop归档命令语法
$ hadoop archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
# hadoop archive -archiveName:为固定命令字
# Name:为指定的har包名称,必须以 .har 结尾
# -p:源路径及目标路径
# 将HDFS中的/test/input 目录归档至 /test/output 目录,并命名为 input.har
$ hadoop archive -archiveName input.har -p /test/input /test/output
# 归档后,源文件就可以删除了
$ hadoop fs -rm -r -f /test/input/
查看归档文件
$ hadoop fs -ls -R /test/output/input.har # 直接查看,只能看到些索引文件
-rw-r--r-- 3 root supergroup 0 2020-12-28 08:38 /test/output/input.har/_SUCCESS
-rw-r--r-- 3 root supergroup 424 2020-12-28 08:38 /test/output/input.har/_index
-rw-r--r-- 3 root supergroup 23 2020-12-28 08:38 /test/output/input.har/_masterindex
-rw-r--r-- 3 root supergroup 1072 2020-12-28 08:38 /test/output/input.har/part-0
$ hadoop fs -ls -R har:///test/output/input.har # 需要指定使用har协议进行查看
-rw-r--r-- 3 root supergroup 9 2020-12-28 08:34 har:///test/output/input.har/host.conf
-rw-r--r-- 3 root supergroup 9 2020-12-28 08:34 har:///test/output/input.har/hostname
-rw-r--r-- 3 root supergroup 224 2020-12-28 08:34 har:///test/output/input.har/hosts
-rw-r--r-- 3 root supergroup 370 2020-12-28 08:34 har:///test/output/input.har/hosts.allow
-rw-r--r-- 3 root supergroup 460 2020-12-28 08:34 har:///test/output/input.har/hosts.deny
使用归档文件
$ hadoop fs -ls -R /test/input # 查看归档前的目录,已经不存在了
ls: `/test/input': No such file or directory
# 下载归档内的文件到本地
$ hadoop fs -get har:///test/output/input.har/host.conf .
$ hadoop fs -get har:///test/output/input.har/hosts.deny .
$ hadoop fs -get har:///test/output/input.har/hosts.allow .
$ ls
host.conf hosts.allow hosts.deny
HDFS回收站
hadoop提供了回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。
参数说明
- fs.trash.interval:默认为 0,表示禁用回收站,其他值表示设置文件的存活时间,单位为分钟。假设此值为 60,则表示存活一小时,一小时之后文件将被彻底删除。这个选项可以在服务器和客户端上配置。如果服务器端禁用了垃圾,则检查客户端配置。如果在服务器端启用了trash,则使用服务器上配置的值,忽略客户端配置值。
- fs.trash.checkpoint.interval:表示检查回收站的间隔时间。应该小于或等于fs.trash.interval。如果为0,则该值被设置为fs.trash.interval的值。每次运行checkpointer时,它都会在当前之外创建一个新的检查点,并删除几分钟前创建的超过fs.trash.interval的检查点。
开启回收站
$ pwd
/apps/usr/hadoop-2.9.2
$ vim etc/hadoop/core-site.xml # 编辑站点文件,增加如下内容
<!--配置垃圾回收时间为2分钟-->
<property>
<name>fs.trash.interval</name>
<value>2</value>
</property>
<!--每一分钟检查一次回收站的间隔时间-->
<property>
<name>fs.trash.checkpoint.interval</name>
<value>1</value>
</property>
</configuration> # 写在此标签上面即可
<!--修改访问垃圾回收站用户名称为你当前所用名称-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
# 将修改后的站点配置文件分发至其他节点
$ for i in 2 3;do rsync -az etc/hadoop/core-site.xml hadoop0$i:/apps/usr/hadoop-2.9.2/etc/hadoop/;done
# 重启hadoop集群
$ stop-dfs.sh
$ stop-yarn.sh
$ start-dfs.sh
$ start-yarn.sh
# 删除归档文件目录 input.har
$ hadoop fs -rm -r -f /test/output/input.har
20/12/29 07:05:04 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop01:9000/test/output/input.har' to trash at: /user/root/.Trash/201229070600/test/output
# 删除后,如上所示,会告知你目录被移除到了 /user/root/.Trash/201229070600/test/output
# 两分钟后,自动从回收站后删除
恢复回收站数据
# 只需在回收站清空时间到达之前,将数据mv到指定目录即可
$ hadoop fs -mv /user/root/.Trash/201229071000/user/lvjianzhao/test/a.txt /user/lvjianzhao/
清空回收站
$ hadoop fs -expunge
# 此命令并不会真正的清空回收站数据,而是打包放到一个目录下,待回收时间到了后,才进行删除
回收站功能就这些,了解即可。
HDFS快照管理
这里快照的概念,和我们虚拟机的快照概念完全一样,所以就不多说了,直接上实操。
快照管理命令
# 开启 /backup目录的快照功能
$ hdfs dfsadmin -allowSnapshot /backup
# 禁用指定目录的快照功能,默认是禁用
$ hdfs dfsadmin -disallowSnapshot /backup
# 对目录创建快照(默认会在/backup目录下生成 .snapshot/s20201229-073025.293 文件,其中文件名为时间戳)
$ hdfs dfs -createSnapshot /backup
# 指定快照名称为 kuaizhao ,创建快照
$ hdfs dfs -createSnapshot /backup kuaizhao
# 修改快照名称(将原来的kuaizhao 修改为 new_kuaizhao)
$ hdfs dfs -renameSnapshot /backup kuaizhao new_kuaizhao
# 列出当前用户所有可创建快照的目录
$ hdfs lsSnapshottableDir
drwxr-xr-x 0 root supergroup 0 2020-12-29 07:31 2 65536 /backup
# 比较两个快照或者一个快照和一个目录的差异(注意两个路径中间要以 点 分割)
# 并且快照路径不可写绝对路径
$ hdfs snapshotDiff /backup . .snapshot/s20201229-073025.293
# 删除backup目录的 new_kuaizhao 快照
$ hdfs dfs -deleteSnapshot /backup new_kuaizhao
注:如果要禁用某个目录的快照功能,需要先将对应目录的所有快照删除,才可禁用。
1