骚年们,我们今天来学习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. centos7 使用指定邮箱发送邮件

    一.安装sendmail与mail .安装sendmail: ) centos下可以安装命令:yum -y install sendmail ) 安装完后启动sendmail命令:service se ...

  2. systemd的新特性及常见的systemd unit类型分析

    systemd概述 )systemd是一种新的linux系统服务管理器,用于替换init系统,能够管理系统启动过程和系统服务,一旦启动起来,就将监管整个系统.在centos7系统中,PID1被syst ...

  3. java 第七章 面向对象高级特性

    一.类的继承 (一)继承的含义 1.在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化). 2.被继承的类称为父类(超类,基类),新的类称为子类(派生类). ...

  4. BZOJ1012_Maxnumber_KEY

    题目传送门 这是一道单调栈的问题,单调栈维护所有数的最大值. 查询操作时只需要二分找答案即可,枚举栈内的数应该也不会超时. code: /******************************* ...

  5. 北京Uber优步司机奖励政策(4月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. Please ensure JDK installation is valid and compatible with the current OS

    报错如下: Gradle sync failed: Could not run JVM from the selected JDK. Please ensure JDK installation is ...

  7. 虚拟机ubuntu使用串口

    1. 电脑的串口默认是在windows系统上,需要把串口转到ubuntu上面,按照下面的步骤先 2. 找到需要使用的串口 3. 在VMWARE里面连接该串口 或者使用方法 4. 成功之后,检查一下ls ...

  8. cyclone4驱动LM75A温湿度传感器学习

    1. LM75A第一次使用,I2C接口,8脚 2. 打开quartus工程,下面只要是看看代码结构,问题在于多个always语句,逻辑上不太好分清楚,主要看状态机 module I2C_READ( c ...

  9. tcpdump使用

    1. tcpdump选项 它的命令格式为: tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ][ -s ...

  10. Weka java.lang.reflect.InvocationTargetException

    在用Weka导入数据的时候报 java.lang.reflect.InvocationTargetException 错误,Weka运行包没有给出详细的错误信息,无法查到. 直接调试Weka源码,发现 ...