HDFS权限管理篇

                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

一.HDFS权限概述    

HDFS文件权限用作每次访问HDFS文件或目录时尝试的授权检查。HDFS文件权限与通常在Linux或Unix文件系统中使用的权限非常相似。但HDFS域Linux和其他采用POSIX模型的操作系统之间也存在显著差异。

  在Linux中,每个文件和目录都有一个用户和组。HDFS本身没有任何用户或组的概念,HDFS只是从底层的操作系统实体(例如在Linux文件系统中创建的用户和组)导出用户和组。

  在Kerberos集群中,用户的Kerberos凭证决定客户端进程的身份,在默认的简单安全模式下,用户的身份由主机操作系统确定。

  与Linux文件系统一样,可以为文件或目录的所有者,组的成员以及其他人分配单独的文件权限。可以像Linux中一样使用我们熟悉的r(读取文件并列出目录的内容),w(创建或删除文件或目录)和x(访问目录的子目录)权限。

  可以使用八进制(例如"755","644"等)来设置文件的模式。需要注意的是,在Linux中,x表示执行文件的权限,但在HDFS中没有这样的概念。

  当然,您也可以为文件或目录指定umask值。默认的umask值为"022",但是可以通过以下方式为"${HADOOP_HOME}/etc/hadoop/core-site.xml"文件进行修改。
    <property>
      <name>fs.permissions.umask-mode</name>
      <value>037</value>
      <description>指定HDFS集群的umask值,默认值为022(创建的文件(目录)权限即为"755"),在Linux中,x表示执行文件权限,而在HDFS中没有这样的概念,尽管你可以为该文件添加x权限。</description>
    </property>

  温馨提示:【umask值的计算方法,公式为:"实际权限 = max_permnishu & (~umask)"】
    本案例中我配置的umask值为"037",对应二进制为"000 011 111",而"(~umask)"则对应为"111 100 000",因此创建文件的默认权限应该为"740",因此计算过程如下所示:
         111 111 111
      &  ~(000 011 111)
      ----------------
        111 111 111
      &  111 100 000
      ---------------
        111 100 000

HDFS权限管理篇

 

二.HDFS权限相关的配置参数

1>.配置HDFS权限

  可以通过在"${HADOOP_HOME}/etc/hadoop/hdfs-site.xml"配置文件中将参数"dfs.permissions.enabled"的值设置为ture来配置HDFS权限。

  如下所示,有此参数的默认值为true,因此权限检查功能已经打开,故HDFS不需要再执行其他任何操作来进行权限检查。
    <property>
      <name>dfs.permissions.enabled</name>
      <value>true</value>
      <description>如果为"true",则在HDFS中启用权限检查;如果为"false",则关闭权限检查;默认值为"true"。</description>
    </property>

2>.配置HDFS超级用户

  与Linux文件系统不同,主机用户root不是HDFS的超级用户。超级用户是启动NameNode的用户,通常是操作系统用户(如"root","hdfs","hadoop"等),因此用户(如"root","hdfs","hadoop"等)通常是HDFS的超级用户。

  可以通过在"${HADOOP_HOME}/etc/hadoop/hdfs-site.xml"配置文件中设置"dfs.permissions.superusergroup"参数来配置超级用户组(改参数仅能被设置一次)。
    <property>
      <name>dfs.permissions.superusergroup</name>
      <value>admin</value>
      <description>
        此参数指定包含HDFS超级用户的组(可以任意指定,分配给该组的任何用户都将是HDFS超级用户),默认值为"supergroup",我这里自定义超级用户的组名为"admin"。
        需要注意的是,该组名只能被设置一次,当对NameNode节点进行格式化后在修改改参数并不生效!如果你想要的强行生效只能重新格式化NameNode节点。幸运的是,我们可以通过"hdfs dfs -chown"命令来修改某个文件或目录的所属者。
      </description>
    </property>

3>.HDFS如何执行权限检查

  客户端的身份由客户端(用户)的名称和它所属的组的列表组成。HDFS执行文件权限检查,以确保用户是具有适当组权限的所有者或组列表的成员。如果两者都不属于,HDFS检查用户的"其他"文件权限,如果该检查也失败,则拒绝客户端访问HDFS的请求。

  如前所述,在默认的simple操作模式下,由操作系统用户名来确定客户端进程ID,而在Kerberos模式下,通过Kerberos凭据确定客户端身份。

  根据运行集群的模式,一旦HDFS确定了用户的身份,它会使用"${HADOOP_HOME}/etc/hadoop/core-site.xml"文件中的"hadoop.security.group.mapping"属性来确定用户所属的组列表。NameNode执行用户到组的映射。

  如果组不在Linux服务器上,仅在公司LDAP服务器上,则必须配置名为"org.apache.hadoop.security.LdapGroupsMapping"的备用组映射服务,而不是默认组映射实现。

  博主推荐阅读:
    https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-common/GroupsMapping.html

 

三.更改HDFS集群中文件属性的常用命令

1>.chmod命令

  chmod命令用于更改HDFS集群中文件的权限。这类似于shell的chmod命令,但有一些例外(使用"man chmod",你会发现Linux系统支持的参数更多)。
[root@hadoop101.yinzhengjie.com ~]# hdfs dfs -help chmod
-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH... :
  Changes permissions of a file. This works similar to the shell's chmod command
  with a few exceptions.
                                                                                 
  -R           modifies the files recursively. This is the only option currently 
               supported.                                                        
  <MODE>       Mode is the same as mode used for the shell's command. The only   
               letters recognized are 'rwxXt', e.g. +t,a+r,g-w,+rwx,o=r.         
  <OCTALMODE>  Mode specifed in 3 or 4 digits. If 4 digits, the first may be 1 or
               0 to turn the sticky bit on or off, respectively.  Unlike the     
               shell command, it is not possible to specify only part of the     
               mode, e.g. 754 is same as u=rwx,g=rx,o=r.                         
  
  If none of 'augo' is specified, 'a' is assumed and unlike the shell command, no
  umask is applied.
[root@hadoop101.yinzhengjie.com ~]# 
[root@hadoop101.yinzhengjie.com ~]# hdfs dfs -help chmod

相关文章: