HDFS本身没有提供用户名、用户组的创建,在客户端调用Hadoop 的文件操作命令时,hadoop 识别出执行命令所在进程的linux系统的用户名和用户组,然后使用这个用户名和组来检查文件权限。 用户名=linux命令中的`whoami`,而组名等于`bash -c groups `。
启动hadoop hdfs系统的用户即为超级用户,可以进行任意的操作。
如想让leaf用户也可执行hadoop的作业,执行如下操作:
用超级用户hadoop,创建文件 hadoop fs -mkdir /user/leaf
使用hadoop fs -chown 以及-chgrp 命令改变该文件的用户和用户组权限为leaf
在配置文件hdfs-site-xml 中添加项 dfs.permissions.enabled的值为 true (hadoop0.21版本)
要保证leaf这个用户几个节点能ssh无密码相互登录,Java环境变量没问题(我们配置时就忽略了这点,幸亏大飞哥的帮助才搞定)
这样leaf用户就可以提交任务数据到HDFS的/user/leaf目录中,并且可执行hadoop任务
版权声明:本文为博主原创文章,未经博主允许不得转载。
1、问题
Hadoop客户端如何配置可远程操作Hadoop;Hadoop多用户情况下,是如何管理权限并分配存储空间和计算能力,保证集群的稳定。
2、Hadoop平台
要理解客户端如何通过指定用户远程操作hadoop集群,这里先理解下hadoop平台的部署架构。Hadoop是大数据分布式处理的软件框架,集成MapReduce分布式编程模型和HDFS分布式文件存储系统。MapReduce将执作业job分割成任务task,运行于各计算节点的。HDFS负责各个节点的数据存储,实现高吞吐率的数据读写。
Hadoop的主/从(Master/Slave)集群架构,主要由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上,而在每个Slave节点上,部署一个DataNode和TaskTracker。集群datanode之间并行地复制大文件可通过distcp命令。

从这个体系上看,主要是Client和Master之间通信来实现远程和多用户管理。
2、Hadoop客户端安装和配置
1)Centos操作系统下,客户端Client用户名为A,服务器Master用户名为M,复制服务器的Hadoop安装包到客户端。
2)系统/etc/profile配置hadoop的home路径;
3)Hadoop目录下hadoop-env.sh配置jdk路径;
4)Hadoop目录下core-site.xml配置集群namenode路径;
<property>
<name>fs.default.name</name>
<value>hdfs://Master:8020</value>
</property>
5)Hadoop目录下mapred-site.xml配置集群jobtracker路径;
<property>
<name>mapred.job.tracker</name>
<value> Master:8021</value>
</property>
Hadoop客户端已完成配置,如Master服务器已设置好用户A,则可以运行Hadoop命令,如向hdfs系统上传文件。
现在的关键是Master服务器如何用M管理多用户权限,使客户端Client的用户A具有执行Master命令的权限。有必要先了解Linux的ACL机制。
3、ACL机制
ACL(AccessControl List) 访问控制列表,可置特定用户或用户组对于一个文件/目录的操作权限,包包括owner、group、others的read、write、execute权限。主要两个命令是:getfacl查看文件/目录的ACL设定内容和setfacl设置文件/目录的ACL内容。
1)$getfaclmy.cnf //查看my.cnf的acl内容
# file: my.cnf
# owner: root
# group: root
user::rw-
group::r--
other::r—
通过执行$ls-l my.cnf比照更清晰理解:
-rw-r--r-- 1 root root 943 3月 13 2015 my.cnf
2)$setfacl-m o:rwx my.cnf //设置my.cnf文件other
# file: my.cnf
# owner: root
# group: root
user::rw-
group::r--
other::rwx
3)语法参考:setfacl[-bkRd] [{-m|-x} acl参数] 文件名
-m :设置后续的acl参数
-x :删除后续的acl参数
-b :删除所有的acl设定参数
-R :递归设置acl参数
-d :设置预设的acl参数(只对目录有效,在该目录新建的文件也会使用此ACL默认值)
-k :删除预设的acl参数
4)开启和关闭:
ACL默认是开启的,开启和关闭可通过mount -o acl实现。
查看当前文件系统的挂载选项:
# tune2fs -l/dev/sda1 | grep “mount option”
Defaultmount options: user_xattr acl
使用tune2fs开启和关闭acl的命令:
tune2fs -oacl /dev/sda1
tune2fs -o^acl /dev/sda1
4、Hadoop访问控制
Hadoop访问控制分为两级,其中Service Level Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先于文件权限和mapred队列权限验证。Access Control on Job Queues在job调度策略层之上,控制mapred队列的权限。DFS Permmision用户控制文件权限。

Hadoop文件和目录权限管理集成ACL,基于POSIX(Portable Operating System Interface,可移植操作系统接口)模型,支持按用户、用户组、其他用户的读写执行控制权限。
Hadoop修改文件的权限、所有者及其所属组的基本命令如下:
hadoop fs –chmod //修改文件所有者、所属组、其他用户的读、写、执行权限;
haddop fs –chown //修改文件所有者
hadoop fs –chgrp //修改文件所属组
用户组和用户名都是Linux本身管理,Hadoop只是管理特定Linux用户对hdfs文件系统的权限,实现不同客户端通过不同linux帐户远程Hadoop。客户端调用hadoop 的文件操作命令时,hadoop 识别出客户端执行命令所在进程的用户名和用户组(通过linux命令whoami识别用户名、通过groups 识别用户组,也有Kerberos、LDAP等身份识别方式),然后Master服务器检查赋予的该用户名和组的文件权限。
客户端Client启动hadoop进程远程Namenode时识别用户为A;Master服务器系统已有分配好hdfs文件权限的用户A,收到客户端请求后,检查A所执行命令的文件权限。
那么Hadoop具体如何分配用户权限及其所拥有的存储空间和计算能力。
5、Hadoop多用户管理
Master服务器的hadoop超级用户M(不是Linux操作系统的root),具有启动集群和执行所有命令的权限。那么M超级用户是如何管理hadoop普通用户的权限。
1)新建Master服务器Linux系统用户A、用户组A;
2)Hadoop创建用户A的目录
$hadoop fs –mkdir/user/A
$hadoop fs –ls /user/A //查看该文件夹权限
3)赋予用户A拥有目录的权限
$hadoop fs –chownA:A /user/A
4)设定用户A目录的空间容量
$hadoopdfsadmin –setSpaceQuota 1t /user/A //如设置为1T
此时客户端A用户启动hadoop远程Master即可执行相关hadoop命令,提交任务数据到HDFS的/user/A目录。实际上,简单的多用户权限管理并不需要ACL功能,只需要hadoop本身文件操作命令即可,将hadoop多用户权限配置转移成单纯的hdfs文件的用户权限配置。
那如何进一步管理多用户的文件权限和资源能力呢?
对于复杂的文件权限访问控制,如要用户组里的所有用户都具备用户组相应的权限,需要使用ACL权限管理机制。
1)Hadoop启用ACL
hdfs-site.xml设置:
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value>
</property>
core-site.xml设置用户组默认权限:
<property>
<name>fs.permissions.umask-mode</name>
<value>022</value>
</property>
2)HadoopACL命令
$hdfs dfs -getfacl [-R] path
显示文件和目录的访问控制列表。如果一个目录有默认的ACL,getfacl也可以显示默认的ACL设置。
$hdfs dfs -setfacl [-R] [-b|-k -m|-x acl_spec path]|[--set acl_spec path]
设置文件和目录的ACL
-R: Use thisoption to recursively list ACLs for all files and directories.
-b: Revokeall permissions except the base ACLs for user, groups and others.
-k: Removethe default ACL.
-m: Add newpermissions to the ACL with this option. Does not affect existing permissions.
-x: Removeonly the ACL specified.
参考:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
对于多用户的资源分配,Hadoop通过Fair Scheduler或者 Capacity Scheduler支持,而作业管理则通过ACL来满足。
1)资源管理:以用户组和用户为主体配置可用资源。Fair Scheduler将整个Yarn的可用资源划分成多个资源池,支持按照用户名配置所属的资源池。每个资源池中可以配置最小和最大的可用资源(内存和CPU)、最大可同时运行Application数量、权重、以及可以提交和管理Application的用户等。
2)作业管理:主要是作业提交权限控制、作业运行状态查看权限控制等。如限定可提交作业的用户、限定可查看作业运行状态的用户、限定普通用户只能修改自己作业的优先级、kill自己的作业、高级用户可以控制所有作业等。
6、总结
对于Hadoop多用户管理的机制,从用户创建、到文件管理、资源和作业管理,通过两天时间的学习,大致梳理了下。对于进一步深入掌握Hadoop相关机制,还有很漫长的路,需要通过实践不断总结。
Hadoop多用户管理最主要是基于linux的用户分组和用户基础,并应用ACL管理文件和作业访问权限。在具体作业和资源管理上,还未进一步试验练习。
顶
-
0
踩
HDFS本身没有提供用户名、用户组的创建,在客户端调用Hadoop 的文件操作命令时,hadoop 识别出执行命令所在进程的linux系统的用户名和用户组,然后使用这个用户名和组来检查文件权限。 用户名=linux命令中的`whoami`,而组名等于`bash -c groups `。
启动hadoop hdfs系统的用户即为超级用户,可以进行任意的操作。
如想让leaf用户也可执行hadoop的作业,执行如下操作:
用超级用户hadoop,创建文件 hadoop fs -mkdir /user/leaf
使用hadoop fs -chown 以及-chgrp 命令改变该文件的用户和用户组权限为leaf
在配置文件hdfs-site-xml 中添加项 dfs.permissions.enabled的值为 true (hadoop0.21版本)
要保证leaf这个用户几个节点能ssh无密码相互登录,Java环境变量没问题(我们配置时就忽略了这点,幸亏大飞哥的帮助才搞定)
这样leaf用户就可以提交任务数据到HDFS的/user/leaf目录中,并且可执行hadoop任务
版权声明:本文为博主原创文章,未经博主允许不得转载。
1、问题
Hadoop客户端如何配置可远程操作Hadoop;Hadoop多用户情况下,是如何管理权限并分配存储空间和计算能力,保证集群的稳定。
2、Hadoop平台
要理解客户端如何通过指定用户远程操作hadoop集群,这里先理解下hadoop平台的部署架构。Hadoop是大数据分布式处理的软件框架,集成MapReduce分布式编程模型和HDFS分布式文件存储系统。MapReduce将执作业job分割成任务task,运行于各计算节点的。HDFS负责各个节点的数据存储,实现高吞吐率的数据读写。
Hadoop的主/从(Master/Slave)集群架构,主要由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上,而在每个Slave节点上,部署一个DataNode和TaskTracker。集群datanode之间并行地复制大文件可通过distcp命令。
从这个体系上看,主要是Client和Master之间通信来实现远程和多用户管理。
2、Hadoop客户端安装和配置
1)Centos操作系统下,客户端Client用户名为A,服务器Master用户名为M,复制服务器的Hadoop安装包到客户端。
2)系统/etc/profile配置hadoop的home路径;
3)Hadoop目录下hadoop-env.sh配置jdk路径;
4)Hadoop目录下core-site.xml配置集群namenode路径;
<property>
<name>fs.default.name</name>
<value>hdfs://Master:8020</value>
</property>
5)Hadoop目录下mapred-site.xml配置集群jobtracker路径;
<property>
<name>mapred.job.tracker</name>
<value> Master:8021</value>
</property>
Hadoop客户端已完成配置,如Master服务器已设置好用户A,则可以运行Hadoop命令,如向hdfs系统上传文件。
现在的关键是Master服务器如何用M管理多用户权限,使客户端Client的用户A具有执行Master命令的权限。有必要先了解Linux的ACL机制。
3、ACL机制
ACL(AccessControl List) 访问控制列表,可置特定用户或用户组对于一个文件/目录的操作权限,包包括owner、group、others的read、write、execute权限。主要两个命令是:getfacl查看文件/目录的ACL设定内容和setfacl设置文件/目录的ACL内容。
1)$getfaclmy.cnf //查看my.cnf的acl内容
# file: my.cnf
# owner: root
# group: root
user::rw-
group::r--
other::r—
通过执行$ls-l my.cnf比照更清晰理解:
-rw-r--r-- 1 root root 943 3月 13 2015 my.cnf
2)$setfacl-m o:rwx my.cnf //设置my.cnf文件other
# file: my.cnf
# owner: root
# group: root
user::rw-
group::r--
other::rwx
3)语法参考:setfacl[-bkRd] [{-m|-x} acl参数] 文件名
-m :设置后续的acl参数
-x :删除后续的acl参数
-b :删除所有的acl设定参数
-R :递归设置acl参数
-d :设置预设的acl参数(只对目录有效,在该目录新建的文件也会使用此ACL默认值)
-k :删除预设的acl参数
4)开启和关闭:
ACL默认是开启的,开启和关闭可通过mount -o acl实现。
查看当前文件系统的挂载选项:
# tune2fs -l/dev/sda1 | grep “mount option”
Defaultmount options: user_xattr acl
使用tune2fs开启和关闭acl的命令:
tune2fs -oacl /dev/sda1
tune2fs -o^acl /dev/sda1
4、Hadoop访问控制
Hadoop访问控制分为两级,其中Service Level Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先于文件权限和mapred队列权限验证。Access Control on Job Queues在job调度策略层之上,控制mapred队列的权限。DFS Permmision用户控制文件权限。
Hadoop文件和目录权限管理集成ACL,基于POSIX(Portable Operating System Interface,可移植操作系统接口)模型,支持按用户、用户组、其他用户的读写执行控制权限。
Hadoop修改文件的权限、所有者及其所属组的基本命令如下:
hadoop fs –chmod //修改文件所有者、所属组、其他用户的读、写、执行权限;
haddop fs –chown //修改文件所有者
hadoop fs –chgrp //修改文件所属组
用户组和用户名都是Linux本身管理,Hadoop只是管理特定Linux用户对hdfs文件系统的权限,实现不同客户端通过不同linux帐户远程Hadoop。客户端调用hadoop 的文件操作命令时,hadoop 识别出客户端执行命令所在进程的用户名和用户组(通过linux命令whoami识别用户名、通过groups 识别用户组,也有Kerberos、LDAP等身份识别方式),然后Master服务器检查赋予的该用户名和组的文件权限。
客户端Client启动hadoop进程远程Namenode时识别用户为A;Master服务器系统已有分配好hdfs文件权限的用户A,收到客户端请求后,检查A所执行命令的文件权限。
那么Hadoop具体如何分配用户权限及其所拥有的存储空间和计算能力。
5、Hadoop多用户管理
Master服务器的hadoop超级用户M(不是Linux操作系统的root),具有启动集群和执行所有命令的权限。那么M超级用户是如何管理hadoop普通用户的权限。
1)新建Master服务器Linux系统用户A、用户组A;
2)Hadoop创建用户A的目录
$hadoop fs –mkdir/user/A
$hadoop fs –ls /user/A //查看该文件夹权限
3)赋予用户A拥有目录的权限
$hadoop fs –chownA:A /user/A
4)设定用户A目录的空间容量
$hadoopdfsadmin –setSpaceQuota 1t /user/A //如设置为1T
此时客户端A用户启动hadoop远程Master即可执行相关hadoop命令,提交任务数据到HDFS的/user/A目录。实际上,简单的多用户权限管理并不需要ACL功能,只需要hadoop本身文件操作命令即可,将hadoop多用户权限配置转移成单纯的hdfs文件的用户权限配置。
那如何进一步管理多用户的文件权限和资源能力呢?
对于复杂的文件权限访问控制,如要用户组里的所有用户都具备用户组相应的权限,需要使用ACL权限管理机制。
1)Hadoop启用ACL
hdfs-site.xml设置:
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value>
</property>
core-site.xml设置用户组默认权限:
<property>
<name>fs.permissions.umask-mode</name>
<value>022</value>
</property>
2)HadoopACL命令
$hdfs dfs -getfacl [-R] path
显示文件和目录的访问控制列表。如果一个目录有默认的ACL,getfacl也可以显示默认的ACL设置。
$hdfs dfs -setfacl [-R] [-b|-k -m|-x acl_spec path]|[--set acl_spec path]
设置文件和目录的ACL
-R: Use thisoption to recursively list ACLs for all files and directories.
-b: Revokeall permissions except the base ACLs for user, groups and others.
-k: Removethe default ACL.
-m: Add newpermissions to the ACL with this option. Does not affect existing permissions.
-x: Removeonly the ACL specified.
参考:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
对于多用户的资源分配,Hadoop通过Fair Scheduler或者 Capacity Scheduler支持,而作业管理则通过ACL来满足。
1)资源管理:以用户组和用户为主体配置可用资源。Fair Scheduler将整个Yarn的可用资源划分成多个资源池,支持按照用户名配置所属的资源池。每个资源池中可以配置最小和最大的可用资源(内存和CPU)、最大可同时运行Application数量、权重、以及可以提交和管理Application的用户等。
2)作业管理:主要是作业提交权限控制、作业运行状态查看权限控制等。如限定可提交作业的用户、限定可查看作业运行状态的用户、限定普通用户只能修改自己作业的优先级、kill自己的作业、高级用户可以控制所有作业等。
6、总结
对于Hadoop多用户管理的机制,从用户创建、到文件管理、资源和作业管理,通过两天时间的学习,大致梳理了下。对于进一步深入掌握Hadoop相关机制,还有很漫长的路,需要通过实践不断总结。
Hadoop多用户管理最主要是基于linux的用户分组和用户基础,并应用ACL管理文件和作业访问权限。在具体作业和资源管理上,还未进一步试验练习。
-
顶
- 0
-
踩
版权声明:本文为博主原创文章,未经博主允许不得转载。
非Master服务器用户也能通过客户端远程访问Hadoop
现象:在Hadoop集群多用户管理实践中发现,客户端用非Master服务器配置的用户连接Master,也通用具备对指定目录的操作权限。比如Master服务器提供的用户的是A,理论上客户端应用在A用户下部署安装hadoop后远程连接,但现在客户端用B用户安装Hadoop客户端并连接Master服务器,且可在指定目录下rwx,只是在涉及datanode任务时会提示权限不足。
原理:默认ACL必须包含所有最小要求的ACL项,包括文件拥有者项,文件所属的组项和其它用户项。如果用户没有在默认ACL中配置上述三项中的任何一个,那么该项将通过从访问ACL拷贝对应的权限来自动插入,或者如果没有访问ACL则自动插入权限位。默认ACL也必须拥有mask,如果mask没有被指定,通过计算所有被mask过滤项的权限与(&运算)自动插入mask。当一个文件使用ACL时,权限检查的算法则变为:
1)当用户名为文件的属主时,会检查属主的权限。
2)否则如果用户名匹配命名用户条目中的一个时,权限会被检查并通过mask权限来进行过滤。
3)否则如果文件的组匹配到当前用户的组列表中的一个时,而这些权限经过mask过滤后仍然会授权,会被允许使用。
4)否则如果其中一个命名组条目匹配到组列表中的一个成员,而这些权限经过mask过滤后仍然会授权,会被允许使用。
5)否则如果文件组和任何命名组条目匹配到组列表中的一个成员时,但是访问不会被任何一个权限所授权时,访问会被拒绝。
6)除此之外,other权限位会被检查。
最佳实践时基于传统的权限位设置大部分权限要求,然后定义少量带有特殊规则的ACL增加权限位。相比较只是用权限位的文件,使用ACL的文件会在NameNode中产生额外的内存消耗。
分析:ACL机制分user、group、other三组权限,对于非master服务器创建的用户连接过来的客户端的用户,放在other组管理,如果other组权限ACL设置为rwx权限则具备操作权限。
1)unnameduser (file owner)文件的拥有者
2)unnamedgroup (file group)文件的所属组
3)nameduser除了文件的拥有者和拥有组之外,的其它用户
4)namedgroup除了文件的拥有者和拥有组之外,的其它用户
mask 权限掩码,用于过滤named user和named group的权限
HDFS通过ACL控制文件目录权限,在服务器上新增的用户目录/user/A,然后把该配置同hadoop包给到客户端配置,这样通过客户端连接上来的就默认文件目录/user/A属于A用户,如果客户端是通过B部署客户端并远程连接,则目录/user/A用other组权限来授予B用户。显然A用户是文件拥有者,而B用户是其他用户。
这里面需要关注集群多用户管理上的两个细节:
1)Master新建用户所配置的目录体现在Hadoop客户端那个配置文件下,这样通过客户端连接上来的不管是哪个用户,都是检查该目录的权限。
2)要重点掌握ACL机制,并理解mask作用。
实际上,对于Hadoop多用户集群管理,如果只是通过hdfs集成ACL机制来支撑,那也只是实现了文件目录的权限控制,对于资源调度和作业管理,如存储空间和计算能力,还需依赖其他机制。-
顶
- 0
-
踩
===================================
前言
最近有一些需求,就是需要在hadoop集群中实现多用户管理,因此在网上搜了很多的资料。其中有一种方法感觉还是比较可行,链 接:http://cn.soulmachine.me/blog/20140206/大概方式是:先新建一个用户test1,然后把hadoop的安装 目录复制一份copy到这个用户test1的目录下,再赋一下权限,然后这个用户就可以向集群提交程序了。后来经过一些列的尝试,发现确实可以实现多用户 管理,而且test1用户在hdfs中只能对自己的目录进行操作,但是毕竟资历太浅,只能隐隐约约感觉这种方法可以用,不明其原因。作为一名有轻度强迫症 期望能先明白原理而后用的人来说,确实不太可取这种方法。 我也很好奇公司里面都是怎样使用hadoop多用户管理的,肯定会有比较好的解决方法,无奈自己不清楚,因此就用现有的linux和hadoop的一些知 识尝试先实践一套方案,整个过程全部是自己摸摸索索,各种尝试出来的,有可能思路上也不是特别好。如有更好的方法,请指教。
一、背景
现有hadoop集群,安装目录在/home/hadoop/hadoop-2.5.1,hadoop的超级用户名就是hadoop,用户组也是hadoop 需要能够加入新的用户如:test1,test2,test3........ 而且以后新加入用户的操作能比较简单。 这些test用户能够提交hadoop作业,而且能在hdfs中被指定的位置进行文件操作,他们能够看到本地hadoop安装目录的文件,但是只能看和执行,没有写和删除操作,不能启动和关闭集群,只能运行程序。
二、创建用户
创建新的用户,并且加入hadoop用户组中。
view source print ?
1.
useradd -g hadoop test1
或者把一个已有用户加入hadoop用户组中。
view source print ?
1.
usermod -a -G groups test1
三、本地目录赋权限
这一步的思路是,把具体的权限都赋给hadoop用户组,让用户组里的用户都能够执行下面的各种操作,因此以后新加入用户的时候只要把用户加入hadoop用户组就具备的相应的权限。 实现这一点,需要使用ACL权限管理机制,在此之前需要执行:(后来静下心来思考,情况简单的时候不用ACL就行,直接使用chmod赋权限就可以了)
view source print ?
1.
mount -o remount,acl /
此时执行mount就会看到: / 目录后面多了个acl,这样就可以使用acl来管理权限了。把hadoop的安装目录(例如:/home/hadoop)权限设置通ky"http://www.it165.net/qq/" target="_blank" class="keylink">qqzrLy208O7p7/JtsHQtNa00NCjrMbky/vTw7un1rvE3LbBus3WtNDQo6y8tMrkyOvI58/C1rjB7qO6CjxwcmUgY2xhc3M9"brush:java;">setfacl -R -m g:hadoop:rx hadoop 如果只是这样的话,在test用户提交作业的时候会提示本地的tmp文件没有写入权限,因此现在需要给设定的tmp文件赋予用户组hadoop写的权限 执行:
view source print ?
1.
setfacl -R -m g:hadoop:rwx /home/hadoop/hadoop-
2.5
.
/tmp
四、hdfs权限管理
执行上面步骤后,就会发现,test1用户已经有了执行hadoop程序的权限,但是不能关集群,不能删除文件。这时候就要考虑hdfs中的安全问题了,既然是test用户,我不希望test用户有太多的权限,特别是不能对某些特殊的文件进行操作(比如说/nlsde),所以执行如下操作:
view source print ?
1.
hdfs dfs -R -chmod
/
但是由于客户端在执行程序的时候会向tmp中写入数据,所有需要给hdfs中的/tmp赋予整个用户组的读写执行操作,因此需要执行:
view source print ?
1.
hdfs dfs -R -chmod
/tmp
然后对于保密的文件夹,比如说/nlsde,我再执行:
view source print ?
1.
hdfs dfs -R -chmod
/nlsde
这样的话,除了超级用户,就没有人能够访问这些文件了。然后,我需要有一个文件夹/test,所有的test1,test2,等用户都能访问它,并且以后每个用户的工作环境也在这个目录里面:
view source print ?
1.
hdfs dfs -R -chmod
/test
至此,基本环境已经成了,但是每个用户都应该有自己的私有空间,test1需要自己的内容不让别人看到,因此,我们需要给test1一个私有的文件夹。
view source print ?
1.
hdfs dfs -mkdir /test/test1
2.
hdfs dfs -chown test1 /test/test1
但是,这样还是不够的,其他用户照样可以访问这个文件夹,现在需穴 ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq9/NK7sr3J6NbDo6yyu8jDdGVzdDLV4tCp08O7p8C0t8POytXiuPbOxLz+vNCho8u909CyxcrHzfW1wKOhCjxwcmUgY2xhc3M9"brush:java;">hdfs dfs -chmod 700 /test/test1此时再看文件信息,其他用户已经不能再访问了。
五、添加新用户
现在添加新的用户测试,为了方面可以写成脚本比较方便:
view source print ?
1.
sudo useradd -g hadoop test2
2.
sudo passwd test2
3.
hdfs dfs -mkdir /test/test2
4.
hdfs dfs -chown test2 /test/test2
5.
hdfs dfs -chmod
/test/test2
做些测试,使用test2,看看能不能访问test1的文件夹

Ok,至此hadoop的多用户管理已经基本能够满足我的一些需求了,但是这里面应该还有很多细节没有考虑到,需要在实际中才能发现问题。 我现在迫切地想知道的是,实际中的运维是怎样管理hadoop多用户管理的,是否也是我这种方式,或者是有其他更先进的方法? 通过这次尝试我就发现,自己在某些问题上还是会有一些偏执的,就像在解决多用户方面上,为了达到某个目标,在使用各种权限的操作,这种思路很难理清,能把这一套流程的思路正路下来需要花不少时间。 这篇博客给了我很大的启发:http://tiankefeng0520.iteye.com/blog/2029146 再次看hadoop的官网,发现了类似的方法,看来基本思路是对的:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
=================================================
ACL权限控制
设置ACL权限:setfacl
查看ACL权限:getfacl
ACL权限控制主要目的是提供传统的owner,group,other的read,wirte,execute权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限
比如:某一目录权限为
drwx------ 2 root root 4096 03-10 13:51./acldir
用户user对此目录无任何权限因此无法进入此目录,ACL可单独为用户user设置这个目录的权限,使其可以操作这个目录
ACL启动
要使用ACL必须要有文件系统支持才行,目前绝大多数的文件系统都会支持,EXT3文件系统默认启动ACL的
查看文件系统是否支持ACL
- [root@localhost tmp]# dumpe2fs -h /dev/sda2
- dumpe2fs 1.39 (29-May-2006)
- ……
- sparse_super large_file
- Default mount options: user_xattr acl
加载ACL功能
如果UNIX LIKE支持ACL但是文件系统并不是默认加载此功能,可自己进行添加
- [root@localhost tmp]# mount -o remount,acl /
- [root@localhost tmp]# mount
- /dev/sda2 on / type ext3 (rw,acl)
同样也可以修改磁盘挂在配置文件设置默认开机加载
- [root@localhost tmp]# vi /etc/fstab
- LABEL=/ / ext3 defaults,acl 1 1
查看ACL权限
语法:getfacl filename
设置ACL权限
语法:setfacl [-bkRd] [-m|-x acl 参数] 目标文件名
选项与参数:
-m:设置后续的acl参数,不可与-x一起使用
-x: 删除后续的acl参数,不可与-m一起使用
-b:删除所有的acl参数
-k:删除默认的acl参数
-R:递归设置acl参数
-d:设置默认acl参数,只对目录有效
针对特殊用户
设置格式:u:用户账号列表:权限
权限:rwx的组合形式
如用户列表为空,代表设置当前文件所有者权限
举例:
- [root@localhost tmp]# mkdir -m 700 ./acldir; ll -d ./acldir
- drwx------ 2 root root 4096 03-10 13:51 ./acldir
- [root@localhost tmp]# su tkf
- [tkf@localhost tmp]$ cd ./acldir/
- bash: cd: ./acldir/: 权限不够 =>用户无X权限
- [tkf@localhost tmp]$ exit
- exit
- [root@localhost tmp]# setfacl -m u:tkf:x ./acldir/
- =>针对用户tkf设置acldir目录的权限为x
- [root@localhost tmp]# ll -d ./acldir/
- drwx--x---+ 2 root root 4096 03-10 13:51 ./acldir/
- =>通过ACL添加权限在权限末尾会增加多个一个“+”同时文件原本权限也发生变化。
- =>可通过getfacl查看原始目录权限
- [root@localhost tmp]# getfacl ./acldir/
- # file: acldir
- # owner: root
- # group: root
- user::rwx
- user:tkf:--x =>记录tkf用户针对此目录有acl权限
- group::---
- mask::--x
- other::---
- =>这里需要特殊说明,只是tkf这个用户具有X权限,其他用户还是无权限的
- [root@localhost tmp]# su tkf
- [tkf@localhost tmp]$ cd ./acldir/
- [tkf@localhost acldir]$
- =>用户tkf可以具有x权限可以进入目录
针对特定用户组
设置格式:g:用户组列表:权限
权限:rwx的组合形式
如用户组列表为空,代表设置当前文件所属用户组权限
举例:
- [root@localhost tmp]# setfa
- setfacl setfattr
- [root@localhost tmp]# setfacl -m g:users:rx ./acldir/
- [root@localhost tmp]# getfacl ./acldir/
- # file: acldir
- # owner: root
- # group: root
- user::rwx
- user:tkf:--x
- group::--- => 其他用户组(非acl设置)的权限
- group:users:r-x => 记录users用户组针对此目录有acl权限
- mask::r-x
- other::---
针对有效权限设置
有效权限(mask)就是acl权限设置的极限值,也就是你所设置的acl权限一定是mask的一个子集,如果超出mask范围会将超出的权限去掉
设置格式:m:权限
权限:rwx的组合形式
举例:
- [root@localhost tmp]# setfacl -m m:x ./acldir/
- [root@localhost tmp]# getfacl ./acldir/
- # file: acldir
- # owner: root
- # group: root
- user::rwx
- user:tkf:--x
- group::r-x #effective:--x
- group:users:r-x #effective:--x
- mask::--x
- other::---
针对默认权限设置
我们前面都是针对一个目录为一个用户(组)设置特定权限,但是如果这个目录下在新创建的文件是不具有这些针对这个用户的特定权限的。为了解决这个问题,就需要设置默认acl权限,使这个目录下新创建的文件有和目录相同的ACL特定权限
设置格式:d:[u|g]:用户(组)列表:权限
举例
- [root@localhost tmp]# mkdir -m 711 ./defdir
- [root@localhost tmp]# setfacl -m u:tkf:rxw ./defdir
- [root@localhost tmp]# ll -d ./defdir/
- drwxrwx--x+ 2 root root 4096 03-10 15:23 ./defdir/
- =>目录权限具有acl特定权限(后面+)
- [root@localhost tmp]# touch ./defdir/a.file;ll ./defdir/
- -rw-r--r-- 1 root root 0 03-10 15:25 a.file
- =>新创建的文件不具有acl特定权限(后面无+)
- [root@localhost tmp]# setfacl -m d:u:tkf:rxw ./defdir
- =>设置默认权限
- [root@localhost tmp]# getfacl ./defdir/
- # file: defdir
- # owner: root
- # group: root
- user::rwx
- user:tkf:rwx
- group::--x
- mask::rwx
- other::--x
- default:user::rwx
- default:user:tkf:rwx
- default:group::--x
- default:mask::rwx
- default:other::--x
- [root@localhost tmp]# touch ./defdir/b.file;ll ./defdir/
- -rw-r--r-- 1 root root 0 03-10 15:25 a.file
- -rw-rw----+ 1 root root 0 03-10 15:26 b.file
- =>新创建文件默认带有acl特定权限
- [root@localhost tmp]# getfacl ./defdir/b.file
- # file: defdir/b.file
- # owner: root
- # group: root
- user::rw-
- user:tkf:rwx #effective:rw-
- group::--x #effective:---
- mask::rw-
- other::---
- =>这快我有个疑问,为什么mask值是rw,我猜测和文件最大权限有关,
- =>对于文件来时默认最大权限是666即UMASK为0000.那个对于可执行文件来说
- =>没有X,难道还需要使用chmod设置? 疑问!!