date: 2021-01-03title: HDFS之归档、回收站、快照管理 #标题
tags: Hadoopp#标签
categories: Hadoop # 分类

记录下hadoop中小文件归档、回收站及快照功能介绍。

小文件归档

HDFS存储小文件弊端

HDFS中,每个文件均按照块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效,因为因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如:一个1MB的文件设置为128M的块存储,实际使用的是1MB的磁盘空间,而不是128M。

解决存储小文件办法之一

HDFS存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体来说,HDFS存档文件对内还是一个一个独立文件,但对于NameNode而言却是一个整理,由此减少NameNode的内存使用。具体示意图如下:

HDFS之归档、回收站、快照管理 - 图1

创建归档
  1. # 上传小文件用于测试
  2. $ hadoop fs -mkdir -p /test/input
  3. $ hadoop fs -put host.conf /test/input/
  4. $ hadoop fs -put hosts /test/input/
  5. $ hadoop fs -put hostname /test/input/
  6. $ hadoop fs -put hosts.allow /test/input/
  7. # hadoop归档命令语法
  8. $ hadoop archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  9. # hadoop archive -archiveName:为固定命令字
  10. # Name:为指定的har包名称,必须以 .har 结尾
  11. # -p:源路径及目标路径
  12. # 将HDFS中的/test/input 目录归档至 /test/output 目录,并命名为 input.har
  13. $ hadoop archive -archiveName input.har -p /test/input /test/output
  14. # 归档后,源文件就可以删除了
  15. $ hadoop fs -rm -r -f /test/input/

查看归档文件
  1. $ hadoop fs -ls -R /test/output/input.har # 直接查看,只能看到些索引文件
  2. -rw-r--r-- 3 root supergroup 0 2020-12-28 08:38 /test/output/input.har/_SUCCESS
  3. -rw-r--r-- 3 root supergroup 424 2020-12-28 08:38 /test/output/input.har/_index
  4. -rw-r--r-- 3 root supergroup 23 2020-12-28 08:38 /test/output/input.har/_masterindex
  5. -rw-r--r-- 3 root supergroup 1072 2020-12-28 08:38 /test/output/input.har/part-0
  6. $ hadoop fs -ls -R har:///test/output/input.har # 需要指定使用har协议进行查看
  7. -rw-r--r-- 3 root supergroup 9 2020-12-28 08:34 har:///test/output/input.har/host.conf
  8. -rw-r--r-- 3 root supergroup 9 2020-12-28 08:34 har:///test/output/input.har/hostname
  9. -rw-r--r-- 3 root supergroup 224 2020-12-28 08:34 har:///test/output/input.har/hosts
  10. -rw-r--r-- 3 root supergroup 370 2020-12-28 08:34 har:///test/output/input.har/hosts.allow
  11. -rw-r--r-- 3 root supergroup 460 2020-12-28 08:34 har:///test/output/input.har/hosts.deny

使用归档文件
  1. $ hadoop fs -ls -R /test/input # 查看归档前的目录,已经不存在了
  2. ls: `/test/input': No such file or directory
  3. # 下载归档内的文件到本地
  4. $ hadoop fs -get har:///test/output/input.har/host.conf .
  5. $ hadoop fs -get har:///test/output/input.har/hosts.deny .
  6. $ hadoop fs -get har:///test/output/input.har/hosts.allow .
  7. $ ls
  8. 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的检查点。

开启回收站

  1. $ pwd
  2. /apps/usr/hadoop-2.9.2
  3. $ vim etc/hadoop/core-site.xml # 编辑站点文件,增加如下内容
  4. <!--配置垃圾回收时间为2分钟-->
  5. <property>
  6. <name>fs.trash.interval</name>
  7. <value>2</value>
  8. </property>
  9. <!--每一分钟检查一次回收站的间隔时间-->
  10. <property>
  11. <name>fs.trash.checkpoint.interval</name>
  12. <value>1</value>
  13. </property>
  14. </configuration> # 写在此标签上面即可
  15. <!--修改访问垃圾回收站用户名称为你当前所用名称-->
  16. <property>
  17. <name>hadoop.http.staticuser.user</name>
  18. <value>root</value>
  19. </property>
  20. # 将修改后的站点配置文件分发至其他节点
  21. $ for i in 2 3;do rsync -az etc/hadoop/core-site.xml hadoop0$i:/apps/usr/hadoop-2.9.2/etc/hadoop/;done
  22. # 重启hadoop集群
  23. $ stop-dfs.sh
  24. $ stop-yarn.sh
  25. $ start-dfs.sh
  26. $ start-yarn.sh
  27. # 删除归档文件目录 input.har
  28. $ hadoop fs -rm -r -f /test/output/input.har
  29. 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
  30. # 删除后,如上所示,会告知你目录被移除到了 /user/root/.Trash/201229070600/test/output
  31. # 两分钟后,自动从回收站后删除

恢复回收站数据

  1. # 只需在回收站清空时间到达之前,将数据mv到指定目录即可
  2. $ hadoop fs -mv /user/root/.Trash/201229071000/user/lvjianzhao/test/a.txt /user/lvjianzhao/

清空回收站

  1. $ hadoop fs -expunge
  2. # 此命令并不会真正的清空回收站数据,而是打包放到一个目录下,待回收时间到了后,才进行删除

回收站功能就这些,了解即可。

HDFS快照管理

这里快照的概念,和我们虚拟机的快照概念完全一样,所以就不多说了,直接上实操。

快照管理命令

  1. # 开启 /backup目录的快照功能
  2. $ hdfs dfsadmin -allowSnapshot /backup
  3. # 禁用指定目录的快照功能,默认是禁用
  4. $ hdfs dfsadmin -disallowSnapshot /backup
  5. # 对目录创建快照(默认会在/backup目录下生成 .snapshot/s20201229-073025.293 文件,其中文件名为时间戳)
  6. $ hdfs dfs -createSnapshot /backup
  7. # 指定快照名称为 kuaizhao ,创建快照
  8. $ hdfs dfs -createSnapshot /backup kuaizhao
  9. # 修改快照名称(将原来的kuaizhao 修改为 new_kuaizhao)
  10. $ hdfs dfs -renameSnapshot /backup kuaizhao new_kuaizhao
  11. # 列出当前用户所有可创建快照的目录
  12. $ hdfs lsSnapshottableDir
  13. drwxr-xr-x 0 root supergroup 0 2020-12-29 07:31 2 65536 /backup
  14. # 比较两个快照或者一个快照和一个目录的差异(注意两个路径中间要以 点 分割)
  15. # 并且快照路径不可写绝对路径
  16. $ hdfs snapshotDiff /backup . .snapshot/s20201229-073025.293
  17. # 删除backup目录的 new_kuaizhao 快照
  18. $ hdfs dfs -deleteSnapshot /backup new_kuaizhao

注:如果要禁用某个目录的快照功能,需要先将对应目录的所有快照删除,才可禁用。

1