由于公司的大数据平台 搭建的比较简陋,还要让 之前根本没有接触过 hadoop平台的开发 算法人员使用,他们的错误操作 经常给你带来 意外的惊喜和 感动的泪水,我心里有十万个 MMP。。。
所以刚开始就想干脆像 初中小学那样写个班规似的 使用规范吧,但是规范的约束力是有限的,需要大家相互信任,但是总有人会错误操作的风险,怎么办 怎么办,只能通过强制的方法 解决这个局面。
好汉 大部分都是被逼上梁山的,平台的演进大多也是根据眼前出现的问题 不断精益求精的。所以搭建 权限管理 势在必行。
先简单 介绍一下 思想,其实 有两种 方式 ,
一种是配置 ugi 的xml ,
一种是 直接在 linux 创建相应的用户和组 ,然后把 hdfs 的某一文件夹的操作权限 赋予 该用户和组,
第一种侵入性小,配置简单 ,第二种则简单粗暴 好操作 但如果有成百上千的hadoop操作用户 则是一个不简单 的力气活,最好有一个脚本可以自动化 操作这些。为了 尽快见效,我选择了第二种,而且 还要搭配着与我们的hadoop 任务提交机器 使用。
我们数据算法小组 现在 一共五个人 ,人少就给每个人 设置了一个账号 权限 ,还另外设置了一个 dev 及guests 的账号,方便 其他组和 新加入的小伙伴临时使用
下面开始操作 了
1.在 hadoop master 的节点 创建 这些账户 ,为了这些账户好管理,也要创建一个 组,组可以先用户创建 也可以在用户之后创建
useradd medev && echo da@opo#8N5 | passwd --stdin medev
echo “medev ALL=(ALL) NOPASSWD:ALL” >> /etc/sudoers
groupadd datadev
usermod -a -G datadev medev
这些命令 需要在 root 用户下使用
2.登录到每个用户 的shell 中,然后 把 原来 java hadoop path 的环境变量 粘贴复制到 新创建的用户的 ~/.bashrc,保存并退出,然后
vi ~/.bashrc
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export PATH=PATH:PATH:PATH:JAVA_HOME/bin:HADOOPHOME/bin:HADOOP_HOME/bin:HADOOPHOME/bin:HADOOP_HOME/sbin
export SCALA_HOME=/usr/local/scala
export SQOOP_HOME=/usr/local/sqoop
export PATH=$SQOOP_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/root/bin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/scala/bin
source ~/.bashrc
【注意,第二步 我们只给 dev 和guests 两个用户这样在 Master设置了,其他个人账号没有设置 ,主要是防止这些同事 无意登录到 Master 节点 错误操作,但是 所有新创建的 用户,我们在 任务提交机器都这样配置了】
3.使用hadoop fs -chown user:group /dirpath ,为 hdfs 上的 用户分配 目录操作权限,大前提是这样的原来的日志流目录还是 hadoop 管理员 hadoop 和组 supergroup 的,在 hdfs根目录下创建 一个总的 /outputs目录,dev 用户 可以操控这个 目录 及子目录,然后 其他的个人账号,只可以操控 在 /outputs/下的 各自的子目录集,比如 muller 只可以操作
/outputs/mulleroutput,整个 /outputs目录都属于 该用户组
hadoop fs -chown -R medev:datadev /Outputs/devoutput
这个操作需要在 hadoop管理员的身份执行
然后可以在 Master 使用 hadoop fs -put -get -mkdir -rm -r 命令 来测试,果然都可以实现目录权限的管理,不属于你的 只有查看 和mapreduce的权限,不能创建 不能删除 不能下载, 只能在自己的目录下肆意妄为。
rm: Permission denied: user=meDev, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x
put: Permission denied: user=medev, access=WRITE, inode="/xial":hadoop:supergroup:drwxr-xr-x
mkdir: Permission denied: user=medev, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x
get: /usr/local/hadoop/part-00000.deflate.COPYING (Permission denied)
5.然后在 hadoop 任务提交机器 继续 创建同名的用户 和配置环境变量 即可,然后测试 完全没有压力
但是 我们还是 太天真了 ,我们 做好了 hdfs 目录 权限管理,却发现无法 进行 mapreduce了 ,在运行 hadoop 自带的 wordcount ,也报 权限不足,细细的看,发现 问题的严重性,独自的用户因为不属于 supergroup 组,无法rwx hadoop的根目录的 /tmp目录,此目录 是 放置 map 中间值得目录,难道你忘记了吗,hadoop 在进行 mapreduce时,会把中间结果保存在硬盘 上,实际是hdfs的 /tmp目录中,如果 操作用户 没有权限操作 /tmp也是无法进行mapReduce的,
17/10/27 19:52:21 INFO client.RMProxy: Connecting to ResourceManager at hadoop-master/194.168.255.155:8032 org.apache.hadoop.security.AccessControlException: Permission denied: user=linkedmeGuests, access=EXECUTE, inode="/tmp/hadoop-yarn":hadoop:supergroup:drwx------
所以 要 把 /tmp 目录的权限设置为 777,单单 /tmp设置了还不可以,还要把 其子目录都要配置为777的权限,切换到hadoop 管理员操作
hadoop fs -chmod -R 777 /tmp
然后 再运行 发现又失败了,发现 对output的目录没有操作权限,
17/10/27 19:56:30 INFO mapreduce.Job: Job job_1508742787565_0140 running in uber mode : false
17/10/27 19:56:30 INFO mapreduce.Job: map 0% reduce 0%
17/10/27 19:56:30 INFO mapreduce.Job: Job job_1508742787565_0140 failed with state FAILED due to: Job setup failed : org.apache.hadoop.security.AccessControlException: Permission denied: user=meGuests, access=WRITE, inode="/Outputs/DannyOutputs":Danny:datadev:drwxr-xr-x
这个当然了,我们规定了 每个账号用户的可以操作的output目录,其他别人的目录都不允许操作,所以 只要把output 的目录设置成自己的output目录 创建子目录才可以正常操作,结果运行成功了
另外的 重点 !!!
我们还要配置 一下 hdfs 相关 output目录的存储大小上限,这样 方便管理,不然有人 的output太大,都不晓得 竟然会超过 源日志 大小,这就尴尬了
》bin/hdfs dfs -put readme.txt /finance
》bin/hdfs dfs -du -s /finance
》3901 /finance
》bin/hdfs dfsadmin -setSpaceQuota 4000 /finance
设置/finance的大小上限为4000个字节
》bin/hdfs dfs -put readme1.txt /finance
由于已经超出4000个字节,则会报错
》bin/hdfs dfsadmin -clrSpaceQuota /finance 将配额清除掉
》bin/hdfs dfs -put readme1.txt /finance 这次上传就不会错了~
[apache-nutch-1.2.rar 大约248M]
bin/hdfs fsck /finance/apache-nutch-1.2.rar
参考 http://www.cnblogs.com/i80386/p/3580107.html
这样 把 这些 用户账号 分配并告知 使用者,并 告知 禁止使用root 和管理者用户角色 并不可使用他人账号 ,这样就可以愉快的进行 hdfs 的文件 权限管理了,