骚年们,我们今天来学习hdfs的权限~

请忽略4,5两段内容~

文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html

中文文档参考:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html

1. 概述

hdfs文件系统的权限基于类似POSIX模型来实现的。每个文件和文件夹都和用户和组关联。文件或目录的拥有者、拥有都所在组的用户、其它用户的权限都不同。对于文件,r权限指能读文件,w指能写文件。对于目录,r指能列出目录下的文件,w权限指能创建或者删除目录下的文件\目录,x指能否进入这个目录(读取\执行目录下文件)。

与POSIX模型不同之处是,hdfs上的文件和目录没有setuid和setgid标识位,也没有可执行文件提示。目录可以加上锁标记,防止除superuser、文件或者目录的拥有者 之外的人删除目录中的容易。

HDFS提供了可选的POSIX ACLs功能。

进程在读取HDFS文件时,会被检查用户和组的权限。

2. 用户身份标识

从hadoop0.22开始,支持两种用户身份验证,由参数"hadoop.security.authentication property"决定:

  • simple

    由操作系统来决定用户身份,比如linux上的用户
  • kerberos

    由kerberos凭证来标识client的身份

3. 组映射

一旦用户的身份决定后,就会把用户映射到一个组,由参数"hadoop.security.group.mapping property"决定。默认配置"org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback"会检查Java Native Interface (JNI)是否存在,如果存在则使用hadoop中的API来解析用户的组。如果JNI不存在,则使用"org.apache.hadoop.security.ShellBasedUnixGroupsMapping"这个配置,通过执行bash -c groups或者net group来解析用户的组

此外,,参数值设为"org.apache.hadoop.security.LdapGroupsMapping",可以LDAP服务器来解析用户的组。前提是组在LDAP服务器上存在并且与UNIX上的组不混淆。

HDFS上,namenode做用户的组解析工作,因此namenode所在的主机的配置会决定用户的组的解析。

HDFS将用户和组保存在一个文件或者目录中。注意,HDFS不能像在UNIX一样改变用户和组(there is no conversion from user and group identity numbers as is conventional in Unix.)。

4.关于权限的实现

每次文件或目录操作都传递完整的路径名给name node,每一个操作都会对此路径做权限检查。客户框架会隐式地将用户身份和与name node的连接关联起来,从而减少改变现有客户端API的需求。经常会有这种情况,当对一个文件的某一操作成功后,之后同样的操作却会失败,这是因为文件或路径上的某些目录已经不复存在了。比如,客户端首先开始读一个文件,它向name node发出一个请求以获取文件第一个数据块的位置。但接下去的获取其他数据块的第二个请求可能会失败。另一方面,删除一个文件并不会撤销客户端已经获得的对文件数据块的访问权限。而权限管理能使得客户端对一个文件的访问许可在两次请求之间被收回。重复一下,权限的改变并不会撤销当前客户端对文件数据块的访问许可。(引用自http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)

这一段说了一堆的废话,而且是含糊不清的的英文~

5.文件系统API的变更

如果权限检查失败,所有使用路径参数的方法都会抛出AccessControlException异常。

新增加的方法(2.7.3):

  • public FSDataOutputStream create(Path f, FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, Progressable progress) throws IOException;
  • public boolean mkdirs(Path f, FsPermission permission) throws IOException;
  • public void setPermission(Path p, FsPermission permission) throws IOException;
  • public void setOwner(Path p, String username, String groupname) throws IOException;
  • public FileStatus getFileStatus(Path f) throws IOException;will additionally return the user, group and mode associated with the path.

新建文件或目录的模式受配置参数umask的约束。当使用之前的 create(path, …) 方法(没有指定权限参数)时,新文件的模式是666 & ^umask。当使用新的 create(path, permission, …) 方法(指定了权限参数P)时,新文件的模式是P & ^umask & 666。当使用先前的 mkdirs(path) 方法(没有指定 权限参数)新建一个目录时,新目录的模式是777 & ^umask。当使用新的 mkdirs(path, permission ) 方法(指定了权限参数P)新建一个目录时,新目录的模式是P & ^umask & 777。(什么鬼~)

注:本段内容极有可能是某个历史版本文档复制过来的,在hadoop1.04文档中也有这么一段,完全不是新增啊!

6.应用程序shell的变更

略,跟第5段一样,是一堆过时的废话

7.超级用户

超级用户即运行name node进程的用户。宽泛的讲,如果你启动了name node,你就是超级用户。超级用户干任何事情,因为超级用户能够通过所有的权限检查。没有永久记号保留谁过去是超级用户;当name node开始运行时,进程自动判断谁现在是超级用户。HDFS的超级用户不一定非得是name node主机上的超级用户,也不需要所有的集群的超级用户都是一个。同样的,在个人工作站上运行HDFS的实验者,不需任何配置就已方便的成为了他的部署实例的超级用户。

另外,管理员可以用配置参数指定一组特定的用户,如果做了设定,这个组的成员也会是超级用户。

8.ACLs

关于LINUX ACL(http://www.2cto.com/os/201110/108736.html

默认HDFS不开启ACL,要开启ACL,设置dfs.namenode.acls.enabled=true

访问控制列表提供了不同于用户和组的权限。一个ACL实体规定的用户\组的权限,如:

   user::rw-
user:bruce:rwx #effective:r--
group::r-x #effective:r--
group:sales:rwx #effective:r--
mask::r--
other::r--

这个例子中,文件的拥有都有rx-权限,其所在的组有r-x权限,其它人只的r--权限,因此这个文件的权限是654.此外,用户bruce和sales组对文件有rwx权限。其它用户组有r--权限。mask表示过限制所有group以及命名用户的权限。如bruce group group:sales 被mask后其实只有r权限。mask指定了组和命名用户的最大权限。mask不影响文件的owner和other用户。

上面讲的是"访问ACL",下面讲"默认ACL"。默认ACL控制子文件\目录的权限。只有目录才能有默认ACL。当在目录下创建文件或者目录时,父目录的默认ACL被当作新创建的文件或者目录的访问ACL,并且子目录也会继承父目录的默认ACL。注意,父目录的默认ACL改变时,已经存在的子文件\目录的ACL不会变。

   user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:bruce:rwx #effective:r-x
default:group::r-x
default:group:sales:rwx #effective:r-x
default:mask::r-x
default:other::r-x

目录真正的权限,实际是默认ACL结合umask来实现,umask对ACL进行控制。比如默认的umask是022,意思是:目录755,文件644.那么文件的实际权限将是user::rw- 其它全是r--。

一个ACL实体,至少需要三个条目:unnamed user(file owner) unnamed group(file group) other 。当设置默认ACL时,如果没有提供以上的任务一个条目,都会从目录的access ACL中提取相应的,如果没有access ACL,则会读取permission bits。目录的默认ACL,如果没有设置mark,则到ACL中所有的权限的集合。

hdfs上acl验证顺序:

1.如果client提交的用户是文件拥有者 ,验证权限

2.如果client提交的用户是命名的user,验证权限,然后用mark过虑

3.如果client提交的用户在文件所属的组中,验证组权限,然后用mark过滤

4.如果client提交的用户在命名的组中,验证命名组权限,然后用mark过滤

5.如果client提交的用户是属于other,验证other的权限

提示:最佳实践是,用传统的权限管理来管理文件,然后设置对文件设置一些acl。设置acl会对namenode产生额外的开销。

9.ACL 文件系统API

public void modifyAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void removeAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void public void removeDefaultAcl(Path path) throws IOException;
public void removeAcl(Path path) throws IOException;
public void setAcl(Path path, List<AclEntry> aclSpec) throws IOException;
public AclStatus getAclStatus(Path path) throws IOException;

10.ACL命令

hdfs dfs -getfacl [-R] <path>
Displays the Access Control Lists (ACLs) of files and directories. If a directory has a default ACL, then getfacl also displays the default ACL. hdfs dfs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]
Sets Access Control Lists (ACLs) of files and directories. hdfs dfs -ls <args>
The output of ls will append a ‘+’ character to the permissions string of any file or directory that has an ACL.

具体操作参考hdfs shell.

11.参数配置

参数名 默认值 说明
dfs.permissions.enableddfs.permissions.enabled true true开启权限验证,false关闭。不管true或者false,文件的mode(权限\所有都\组)都不会变。另外chmod chgrp等操作无论如何都会验证权限
dfs.web.ugi = webuser,webgroup 启动hdfs web ui的用户,会根据该用户的权限决定web ui能展示的hdfs内容(这一条我不明白啊啊啊~启动web ui的到底是哪个用户?不是跟namenode一起启动吗?)
dfs.permissions.superusergroup supergroup hdfs的超级用户组,加入该的用户有超级用户权限
fs.permissions.umask-mode 022 HDFS默认的umask
dfs.cluster.administrators 哪些用户(组)能执行管理"default servlets in the namenode".如 hdfs,user1 group1,user2。没弄明白default servlets是什么鬼
dfs.namenode.acls.enabled false 是否开启ACL

12.总结

这主要弄明白:

1.什么是hdfs超级用户? 启动namenode或者加入dfs.permissions.superusergroup组外,其它的组都是linux上的组(各客户机上的)组的用户

2.hdfs上权限是什么样的? 类似于linux上的文件系统。除了superusergroup组外,其它的组都是linux上的组(各客户机上的也算)。用户都是各机器上的操作系统用户。

3.hdfs acl 原理

4.权限相关的配置

即可。

HADOOP docker(九):hdfs权限的更多相关文章

  1. HADOOP docker(七):hive权限管理

    1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...

  2. HADOOP docker(二):HDFS 高可用原理

        1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...

  3. HADOOP docker(十):hdfs 结构体系

    1.简介2.namenode和datanode3.The File System Namespace 文件系统命名空间4.Data Replication 数据复制5.Replica Placemen ...

  4. HADOOP docker(三):HDFS高可用实验

      前言1.机器环境2.配置HA2.1 修改hdfs-site.xml2.2 设置core-site.xml3.配置手动HA3.1 关闭YARN.HDFS3.2 启动HDFS HA4.配置自动HA4. ...

  5. Docker 安装HDFS

    网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...

  6. Hadoop官方文档翻译——HDFS Architecture 2.7.3

    HDFS Architecture HDFS Architecture(HDFS 架构) Introduction(简介) Assumptions and Goals(假设和目标) Hardware ...

  7. HDFS权限问题

    HDFS权限问题 Win下Eclipse提交hadoop程序出错:org.apache.hadoop.security.AccessControlException: Permission denie ...

  8. 【Hadoop学习】HDFS 短路本地读

    Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146296.html 背景 ...

  9. Hadoop学习笔记-HDFS命令

    进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...

随机推荐

  1. Hibernate基础入门

    Hibernate是一个开放源代码的对象关系映射框架,它将POJO与数据库表之间建立映射关系.是全自动的ORM框架,可以自动生成SQL语句并自动执行.它对JDBC进行了非常轻量级的封装,使程序员可以随 ...

  2. js浮点型,整型操作方法汇总(进行中)

    浮点数操作方法如下: 1. Math.ceil()用作向上取整.(ceil 天花板) 2. Math.floor()用作向下取整. (floor 地板) (js 中取整底层原理是位运算的取反~运算,运 ...

  3. 遗传算法详解及c++实现

    1.什么是遗传算法? 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一 ...

  4. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...

  5. ubuntu—终端安装mysql

    ---恢复内容开始--- Step 1 : 安装指令 ~$ sudo apt-get install mysql-server Step 2: 查看是否正常安装 ~$ ps aux | grep my ...

  6. Django中间件执行顺序

    中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...

  7. obfuscator-llvm Xcode集成配置

    一.简介 obfuscator-llvm 是一个开源的代码混淆编译器,能够使编译出来的文件添加垃圾代码和各种跳转流程,给逆向分析者增加难度. 二.编译 (1) 下载 目前最新版的是4.0的,下载地址是 ...

  8. MongoDB 4.0.6 Manual

    General mongod options: -v [ --verbose ] [=arg(=v)] be more verbose (include multiple times for more ...

  9. Linux内核调用I2C驱动_驱动嵌套驱动方法

    禁止转载!!!! Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于 ...

  10. Java 8 中有趣的操作 Stream

    Stream 不是java io中的stream 对象创建 我们没有必要使用一个迭代来创建对象,直接使用流就可以 String[] strs = {"haha","hoh ...