共计 8246 个字符,预计需要花费 21 分钟才能阅读完成。
一. Trash 垃圾回收
1. 背景
DFS 自身也是一个文件系统,那么就会波及到文件数据的删除操作。默认状况下,HDFS 中是没有回收站垃圾桶概念的,删除操作的数据将会被间接删除
2. 性能概述
Trash 机制,叫做回收站或者垃圾桶 。Trash 就像 Windows 操作系统中的回收站一样。它的目标是避免你无心中删除某些货色。默认状况下是不开启的。
启用 Trash 性能后,从 HDFS 中删除某些内容时,文件或目录不会立刻被革除,它们将被挪动到回收站 Current 目录中(/user/${username}/.Trash/current)。
.Trash 中的文件在用户 可配置的时间延迟后被永恒删除。也能够简略地将回收站里的文件挪动到.Trash 目录之外的地位来复原回收站中的文件和目录。
1. Trash Checkpoint
检查点仅仅是用户回收站下的一个目录 ,用于存储在创立检查点之前删除的所有文件或目录。如果你想查看回收站目录,能够在 /user/${username}/.Trash/{timestamp_of_checkpoint_creation} 处看到:
最近删除的文件被挪动到回收站 Current 目录,并且在可配置的工夫距离内,HDFS 会为在 Current 回收站目录下的文件创建检查点 /user/${username}/.Trash/< 日期 >,并在过期时删除旧的检查点。
3. 性能开启
1. 敞开 HDFS 集群
在 node1 节点上,执行一键敞开 HDFS 集群命令:stop-dfs.sh。
2. 批改 core-site.xml 文件
在 node1 节点批改 core-site.xml 文件, 增加上面两个属性:
vim /export/server/hadoop-3.1.4/etc/hadoop/core-site.xml
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
</property>
fs.trash.interval: 分钟数,当超过这个分钟数后检查点会被删除。如果为零,Trash 回收站性能将被禁用。
fs.trash.checkpoint.interval: 检查点创立的工夫距离 (单位为分钟)。 其值应该小于或等于 fs.trash.interval。如果为零,则将该值设置为 fs.trash.interval 的值。每次运行检查点时,它都会从以后版本中创立一个新的检查点,并删除在数分钟之前创立的检查点。
3. 同步集群配置文件
scp -r /export/server/hadoop-3.1.4/etc/hadoop/core-site.xml node2:/export/server/hadoop-3.1.4/etc/hadoop/
scp -r /export/server/hadoop-3.1.4/etc/hadoop/core-site.xml node3:/export/server/hadoop-3.1.4/etc/hadoop/
4. 启动 HDFS 集群
在 node1 节点上,执行一键启动 HDFS 集群命令:start-dfs.sh。
4. 性能应用
1. 删除文件到 Trash
开启 Trash 性能后,失常执行删除操作,文件理论并不会被间接删除,而是被挪动到了垃圾回收站。
Trash 回收站上面查看:
2. 删除文件调过 Trash
有的时候,咱们心愿间接把文件删除,不须要再通过 Trash 回收站了,能够在执行删除操作的时候增加一个参数:-skipTrash.
hadoop fs -rm -skipTrash /smallfile1/3.txt
3. 从 Trash 中复原文件
回收站外面的文件,在到期被主动删除之前,都能够通过命令复原进去。应用 mv、cp 命令把数据文件从 Trash 目录下复制挪动进去就能够了。
hadoop fs -mv /user/root/.Trash/Current/smallfile1/* /smallfile1/
4. 清空 Trash
除了 fs.trash.interval 参数管制到期主动删除之外,用户还 能够通过命令手动清空回收站 ,开释 HDFS 磁盘存储空间。
首先想到的是删除整个回收站目录,将会清空回收站, 这是一个抉择。此外。HDFS 提供了一个命令行工具来实现这个工作:
hadoop fs -expunge
该命令立刻从文件系统中删除过期的检查点。
Snapshot 快照
1. 快照介绍和作用
HDFS snapshot 是 HDFS 整个文件系统,或者某个目录在某个时刻的镜像 。该镜像并不 会随着源目录的扭转而进行动静的更新 。能够将快照了解为拍照片时的那一瞬间的投影,过了那个工夫之后,又会有新的一个投影。
HDFS 快照的核心作用包含: 数据恢复、数据备份、数据测试。
1. 数据恢复
能够通过滚动的形式来对重要的目录进行创立 snapshot 的操作,这样在零碎中就存在针对某个目录的多个快照版本。当用户误删除掉某个文件时,能够通过最新的 snapshot 来进行相干的复原操作。
2. 数据备份
能够应用 snapshot 来进行整个集群,或者某些目录、文件的备份。管理员以某个时刻的 snapshot 作为备份的起始结点,而后 通过比拟不同备份之间差异性,来进行增量备份。
3. 数据测试
在某些重要数据上进行测试或者试验,可能会间接将原始的数据毁坏掉。能够长期的为用户针对要操作的数据来创立一个 snapshot,而后让用户在对应的 snapshot 上进行相干的试验和测试,从而防止对原始数据的毁坏。
2. HDFS 快照的实现
在理解 HDFS 快照性能如何实现之前,首先有一个基本的准则须要记住:快照不是数据的简略拷贝,快照只做差别的记录。 这一准则在其余很多零碎的快照概念中都是实用的,比方磁盘快照,也是不保留实在数据的。因为不保留理论的数据,所以快照的生成往往十分迅速。
在 HDFS 中,如果在其中一个目录比方 / A 下创立一个快照,则快照文件中将会存在与 / A 目录下完全一致的子目录文件构造以及相应的属性信息,通过命令也能看到快照外面具体的文件内容。然而这并不意味着快照曾经对此数据进行齐全的拷贝。这里遵循一个准则:对于大多不变的数据,你所看到的数据其实是以后物理门路所指的内容,而产生变更的 inode 数据才会被快照额定拷贝,也就是所说的差别拷贝。
inode 译成中文就是索引节点,它用来寄存文件及目录的根本信息,蕴含工夫、名称、拥有者、所在组等信息。
HDFS 快照不会复制 datanode 中的块,只记录了块列表和文件大小。
HDFS 快照不会对惯例 HDFS 操作产生不利影响,批改记录按逆时针程序进行,因而能够间接拜访以后数据。通过从以后数据中减去批改来计算快照数据。
3. 快照命令
1. 快照性能启动 / 进行命令
[root@node1 ~]# hdfs dfsadmin
Usage: hdfs dfsadmin
Note: Administrative commands can only be run as the HDFS superuser.
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
HDFS 中能够针对整个文件系统或者文件系统中某个目录创立快照,然而 创立快照的前提是相应的目录开启快照的性能。
如果针对没有启动快照性能的目录创立快照则会报错:
启用快照性能:
hdfs dfsadmin -allowSnapshot /allenwoon
禁用快照性能:
hdfs dfsadmin -disallowSnapshot /allenwoon
2. 快照操作相干命令
[root@node1 ~]# hdfs dfs
Usage: hadoop fs [generic options]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[root@node1 ~]# hdfs lsSnapshottableDir
[root@node1 ~]# hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
快照相干的操作命令有:createSnapshot 创立快照、deleteSnapshot 删除快照、renameSnapshot 重命名快照、lsSnapshottableDir 列出能够快照目录列表、snapshotDiff 获取快照差别报告。
4. 案例: 快照的应用
1. 开启指定目录的快照
hdfs dfsadmin -allowSnapshot /allenwoon
2. 对指定目录创立快照
hdfs dfs -createSnapshot /allenwoon // 零碎主动生成快照名称
hdfs dfs -createSnapshot /allenwoon mysnap1 // 指定名称创立快照
3. 通过 web 浏览器拜访快照
http://node1:9870/explorer.html#/allenwoon/.snapshot
4. 重命名快照
hdfs dfs -renameSnapshot /allenwoon mysnap1 mysnap2
5. 列出以后用户所有能够快照的目录
hdfs lsSnapshottableDir
6. 比拟两个快照不同之处
[root@node1 ~]# echo 222 > 2.txt
[root@node1 ~]# hadoop fs -appendToFile 2.txt /allenwoon/1.txt
[root@node1 ~]# hadoop fs -cat /allenwoon/1.txt
1
222
[root@node1 ~]# hdfs dfs -createSnapshot /allenwoon mysnap3
Created snapshot /allenwoon/.snapshot/mysnap3
[root@node1 ~]# hadoop fs -put zookeeper.out /allenwoon
[root@node1 ~]# hdfs dfs -createSnapshot /allenwoon mysnap4
Created snapshot /allenwoon/.snapshot/mysnap4
hdfs snapshotDiff /allenwoon mysnap2 mysnap3
hdfs snapshotDiff /allenwoon mysnap2 mysnap4
+ The file/directory has been created.
- The file/directory has been deleted.
M The file/directory has been modified.
R The file/directory has been renamed.
7. 删除快照
hdfs dfs -deleteSnapshot /allenwoon mysnap4
8. 删除有快照的目录
hadoop fs -rm -r /allenwoon
领有快照的目录不容许被删除,某种程度上也爱护了文件平安。
三. HDFS 权限治理
1. 总览概述
作为分布式文件系统,HDFS 也集成了一套兼容 POSIX 的权限管理系统 。客户端在进行每次文件操时,零碎会从用户 身份认证 和数据拜访受权 两个环节进行验证:客户端的操作申请会首先通过本地的用户身份验证机制来取得“凭证”(相似于身份证书),而后零碎依据此“凭证”分辨出非法的用户名,再据此查看该用户所拜访的数据是否曾经受权。一旦这个流程中的某个环节出现异常,客户端的操作申请便会失败。
2. UGO 权限治理
1. 介绍
HDFS 的文件权限与 Linux/Unix 零碎的 UGO 模型类型相似,能够简略形容为:每个文件和目录都与一个所有者和一个组相关联。该文件或目录对作为 所有者(USER)的用户 ,作为该 组成员的其余用户(GROUP) 以及对 所有其余用户(OTHER) 具备独自的权限。
不同用户领有不同权限
在 HDFS 中,对于文件,须要 r 权限能力读取文件,而 w 权限能力写入或追加到文件。没有 x 可执行文件的概念。
对于目录,须要 r 权限能力列出目录的内容,须要 w 权限能力创立或删除文件或目录,并且须要 x 权限能力拜访目录的子级。
2. umask 权限掩码
Linux 中umask 可用来设定权限掩码。权限掩码是由 3 个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建设文件时预设的权限。
与 Linux/Unix 零碎相似,HDFS 也提供了 umask 掩码,用于设置在 HDFS 中默认新建的文件和目录权限位。默认 umask 值有属性 fs.permissions.umask-mode 指定,默认值 022。
创立文件和目录时应用的 umask,默认的权限就是:777-022=755。也就是 drwxr-xr-x。
3. UGO 权限相干命令
hadoop fs -chmod 750 /user/itcast/foo // 变更目录或文件的权限位
hadoop fs -chown :portal /user/itcast/foo // 变更目录或文件的属主或用户组
hadoop fs -chgrp itcast _group1 /user/itcast/foo // 变更用户组
须要留神的是,应用这个命令的用户必须是超级用户,或者是该文件的属主,同时也是该用户组的成员。
4. Web 页面批改 UGO 权限
Hadoop3.0 之后,反对在 HDFS Web 页面上应用鼠标批改。
粘滞位(Sticky bit)用法在目录上设置,如此以来,只有目录内文件的所有者或者 root 才能够删除或挪动该文件。如果不为目录设置粘滞位,任何具备该目录写和执行权限的用户都能够删除和挪动其中的文件。理论利用中,粘滞位个别用于 /tmp 目录,以避免普通用户删除或挪动其余用户的文件。
3. 用户身份认证
用户身份认证独立于 HDFS 之外,也就说 HDFS 并不负责用户身份合法性检查,但 HDFS 会通过相干接口来获取相干的用户身份,而后用于后续的权限治理。用户是否非法,齐全取决于集群应用认证体系。目前社区反对两种身份认证,即简略认证(Simple)和 Kerberos。模式由 hadoop.security.authentication 属性指定,默认 simple。
1. simple 认证
基于客户端所在的 Linux/Unix 零碎的登录用户名来进行认证。只有用户能失常登录就认证胜利。客户端与 NameNode 交互时,会将用户的登录账号(通过相似 whoami 的命令来获取)作为非法用户名传递至 Namenode。这意味着应用不同的账号登录到同一个客户端,会产生不同的用户名,故在多租户条件这种认证会导致权限混同;同时歹意用户也能够伪造其他人的用户名非法取得相应的权限,对数据安全造成极大的隐患。线上生产环境个别不会应用。simple 认证时,HDFS 想法是:避免坏蛋误做好事,不避免好人做好事。
2. Kerberos 认证
Kerberos 是麻省理工学院(MIT)开发的 一种网络身份认证协定。它旨在通过应用密钥加密技术为客户端 / 服务器应用程序提供强身份验证。
4. Group Mapping 组映射
在用户身份验证胜利之后,接下来会查看该用户所领有的权限。HDFS 的文件权限也是采纳 UGO 模型,分成用户、组和其余权限。但与 Linux/Unix 零碎不同,HDFS 的用户和组都是应用字符串存储的,在 Linux/Unix 上通用的 UID 和 GID 是无奈在 HDFS 应用的。
此外,HDFS 的组 须要通过 内部的用户组关联(Group Mapping)服务来获取。用户到组的映射能够应用零碎自带的计划(应用 NameNode 服务器上的用户组零碎),也能够通过其余实现相似性能的插件(LDAP、Ranger 等)形式来代替。在拿到用户名后,NameNode 会通过用户组关联服务获取该用户所对应的用户组列表,并用于前期的用户组权限校验。上面是两种次要的实现形式。
1. 基于 Linux/Unix 零碎的用户和用户组
Linux/Unix 零碎上的用户和用户组信息存储在/etc/passwd 和 /etc/group 文件中。默认状况下,HDFS 会通过调用内部的 Shell 命令来获取用户的所有用户组列表。此计划的长处在于组映射服务非常稳固,不易受内部服务的影响。然而用户和用户组治理波及到 root 权限等,同时会在服务器上生成大量的用户组,后续治理,特地是自动化运维方面会有较大影响。
2. 基于应用 LDAP 协定的数据库
OpenLDAP 是一个开源 LDAP 的数据库,通过 phpLDAPadmin 等管理工具或相干接口能够不便地增加用户和批改用户组。HDFS 能够应用 LdapGroupsMappings 来应用 LDAP 服务。通过配置 LDAP 的相干属性,能够通过接口来间接获取到某个用户所有的用户组列表(memberOf)。应用 LDAP 的有余在于须要保障 LDAP 服务的可用性和性能,对于 LDAP 的治理和应用将会后续再作介绍。不同的 LDAP 有不同的实现,须要应用不同类型的 LDAP Schema 来构建,譬如示例中应用的是 Person 和 GroupOfNames 类型而不是 PosixAccount 和 PosixGroup 类型 以下是开启 LDAP 关联的配置文件:
<property>
<name>hadoop.security.group.mapping</name>
<value>org.apache.hadoop.security.LdapGroupsMapping</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.user</name>
<value>cn=Manager,dc=hadoop,dc=apache,dc=org</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.password</name>
<value>hadoop</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.url</name>
<value>ldap://localhost:389/dc=hadoop,dc=apache,dc=org</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.url</name>
<value>ldap://localhost:389/dc=hadoop,dc=apache,dc=org</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.base</name>
<value></value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.user</name>
<value>(&(|(objectclass=person)(objectclass=applicationProcess))(cn={0}))</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.group</name>
<value>(objectclass=groupOfNames)</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.member</name>
<value>member</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
<value>cn</value>
</property>