與其 通過規章制度讓大家 遵守 某項規定 ,時而還要擔驚受怕 總有那么一小嘬人 冒天下之大不韙 以身試法 踐踏 規定,一勞永逸 解決 信任問題的終極辦法 看似有些獨裁 專制,對于有特立獨行思想的刺頭,最好的根治手段就是閹割。現實中 用 囚籠 囚禁 犯人,在 計算機系統中則是 通過權限管理 限制每一個人的操作 范圍。
由于公司的大數據平臺 搭建的比較簡陋,還要讓 之前根本沒有接觸過 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:$JAVA_HOME/bin:$HADOOP_HOME/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 的文件 權限管理了,
尤其要注意 ,密碼不要太簡單 ,因外要外網登陸,不然 被黑也是常事。
另外 hadoop的 acl 需要關注,未來也是需要 配置的,
http://www.lxweimin.com/p/2c8949340f6c
還要配置 hadoop的 ugi