與其 通過規(guī)章制度讓大家 遵守 某項(xiàng)規(guī)定 神郊,時(shí)而還要擔(dān)驚受怕 總有那么一小嘬人 冒天下之大不韙 以身試法 踐踏 規(guī)定定续,一勞永逸 解決 信任問題的終極辦法 看似有些獨(dú)裁 專制,對(duì)于有特立獨(dú)行思想的刺頭糖埋,最好的根治手段就是閹割。現(xiàn)實(shí)中 用 囚籠 囚禁 犯人,在 計(jì)算機(jī)系統(tǒng)中則是 通過權(quán)限管理 限制每一個(gè)人的操作 范圍磷蛹。
由于公司的大數(shù)據(jù)平臺(tái) 搭建的比較簡(jiǎn)陋,還要讓 之前根本沒有接觸過 hadoop平臺(tái)的開發(fā) 算法人員使用溪烤,他們的錯(cuò)誤操作 經(jīng)常給你帶來 意外的驚喜和 感動(dòng)的淚水味咳,我心里有十萬個(gè) MMP。檬嘀。槽驶。
所以剛開始就想干脆像 初中小學(xué)那樣寫個(gè)班規(guī)似的 使用規(guī)范吧,但是規(guī)范的約束力是有限的鸳兽,需要大家相互信任掂铐,但是總有人會(huì)錯(cuò)誤操作的風(fēng)險(xiǎn),怎么辦 怎么辦,只能通過強(qiáng)制的方法 解決這個(gè)局面堡纬。
好漢 大部分都是被逼上梁山的聂受,平臺(tái)的演進(jìn)大多也是根據(jù)眼前出現(xiàn)的問題 不斷精益求精的。所以搭建 權(quán)限管理 勢(shì)在必行烤镐。
先簡(jiǎn)單 介紹一下 思想蛋济,其實(shí) 有兩種 方式 ,
一種是配置 ugi 的xml 炮叶,
一種是 直接在 linux 創(chuàng)建相應(yīng)的用戶和組 碗旅,然后把 hdfs 的某一文件夾的操作權(quán)限 賦予 該用戶和組,
第一種侵入性小镜悉,配置簡(jiǎn)單 祟辟,第二種則簡(jiǎn)單粗暴 好操作 但如果有成百上千的hadoop操作用戶 則是一個(gè)不簡(jiǎn)單 的力氣活,最好有一個(gè)腳本可以自動(dòng)化 操作這些侣肄。為了 盡快見效旧困,我選擇了第二種,而且 還要搭配著與我們的hadoop 任務(wù)提交機(jī)器 使用。
我們數(shù)據(jù)算法小組 現(xiàn)在 一共五個(gè)人 稼锅,人少就給每個(gè)人 設(shè)置了一個(gè)賬號(hào) 權(quán)限 吼具,還另外設(shè)置了一個(gè) dev 及guests 的賬號(hào),方便 其他組和 新加入的小伙伴臨時(shí)使用
下面開始操作 了
1.在 hadoop master 的節(jié)點(diǎn) 創(chuàng)建 這些賬戶 矩距,為了這些賬戶好管理拗盒,也要?jiǎng)?chuàng)建一個(gè) 組,組可以先用戶創(chuàng)建 也可以在用戶之后創(chuàng)建
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.登錄到每個(gè)用戶 的shell 中锥债,然后 把 原來 java hadoop path 的環(huán)境變量 粘貼復(fù)制到 新創(chuàng)建的用戶的 ~/.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 兩個(gè)用戶這樣在 Master設(shè)置了登夫,其他個(gè)人賬號(hào)沒有設(shè)置 ,主要是防止這些同事 無意登錄到 Master 節(jié)點(diǎn) 錯(cuò)誤操作允趟,但是 所有新創(chuàng)建的 用戶悼嫉,我們?cè)? 任務(wù)提交機(jī)器都這樣配置了】
3.使用hadoop fs -chown user:group /dirpath ,為 hdfs 上的 用戶分配 目錄操作權(quán)限拼窥,大前提是這樣的原來的日志流目錄還是 hadoop 管理員 hadoop 和組 supergroup 的,在 hdfs根目錄下創(chuàng)建 一個(gè)總的 /outputs目錄蹋凝,dev 用戶 可以操控這個(gè) 目錄 及子目錄鲁纠,然后 其他的個(gè)人賬號(hào),只可以操控 在 /outputs/下的 各自的子目錄集鳍寂,比如 muller 只可以操作
/outputs/mulleroutput改含,整個(gè) /outputs目錄都屬于 該用戶組
hadoop fs -chown -R medev:datadev /Outputs/devoutput
這個(gè)操作需要在 hadoop管理員的身份執(zhí)行
- 然后可以在 Master 使用 hadoop fs -put -get -mkdir -rm -r 命令 來測(cè)試,果然都可以實(shí)現(xiàn)目錄權(quán)限的管理,不屬于你的 只有查看 和mapreduce的權(quán)限迄汛,不能創(chuàng)建 不能刪除 不能下載捍壤, 只能在自己的目錄下肆意妄為骤视。
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 任務(wù)提交機(jī)器 繼續(xù) 創(chuàng)建同名的用戶 和配置環(huán)境變量 即可,然后測(cè)試 完全沒有壓力
但是 我們還是 太天真了 鹃觉,我們 做好了 hdfs 目錄 權(quán)限管理专酗,卻發(fā)現(xiàn)無法 進(jìn)行 mapreduce了 ,在運(yùn)行 hadoop 自帶的 wordcount 盗扇,也報(bào) 權(quán)限不足祷肯,細(xì)細(xì)的看,發(fā)現(xiàn) 問題的嚴(yán)重性疗隶,獨(dú)自的用戶因?yàn)椴粚儆?supergroup 組佑笋,無法rwx hadoop的根目錄的 /tmp目錄,此目錄 是 放置 map 中間值得目錄斑鼻,難道你忘記了嗎蒋纬,hadoop 在進(jìn)行 mapreduce時(shí),會(huì)把中間結(jié)果保存在硬盤 上坚弱,實(shí)際是hdfs的 /tmp目錄中蜀备,如果 操作用戶 沒有權(quán)限操作 /tmp也是無法進(jìn)行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 目錄的權(quán)限設(shè)置為 777史汗,單單 /tmp設(shè)置了還不可以琼掠,還要把 其子目錄都要配置為777的權(quán)限,切換到hadoop 管理員操作
hadoop fs -chmod -R 777 /tmp
然后 再運(yùn)行 發(fā)現(xiàn)又失敗了停撞,發(fā)現(xiàn) 對(duì)output的目錄沒有操作權(quán)限瓷蛙,
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
這個(gè)當(dāng)然了,我們規(guī)定了 每個(gè)賬號(hào)用戶的可以操作的output目錄戈毒,其他別人的目錄都不允許操作艰猬,所以 只要把output 的目錄設(shè)置成自己的output目錄 創(chuàng)建子目錄才可以正常操作,結(jié)果運(yùn)行成功了
另外的 重點(diǎn) B袷小9谔摇!
我們還要配置 一下 hdfs 相關(guān) output目錄的存儲(chǔ)大小上限道宅,這樣 方便管理食听,不然有人 的output太大,都不曉得 竟然會(huì)超過 源日志 大小污茵,這就尷尬了
》bin/hdfs dfs -put readme.txt /finance
》bin/hdfs dfs -du -s /finance
》3901 /finance
》bin/hdfs dfsadmin -setSpaceQuota 4000 /finance
設(shè)置/finance的大小上限為4000個(gè)字節(jié)
》bin/hdfs dfs -put readme1.txt /finance
由于已經(jīng)超出4000個(gè)字節(jié)樱报,則會(huì)報(bào)錯(cuò)
》bin/hdfs dfsadmin -clrSpaceQuota /finance 將配額清除掉
》bin/hdfs dfs -put readme1.txt /finance 這次上傳就不會(huì)錯(cuò)了~
[apache-nutch-1.2.rar 大約248M]
bin/hdfs fsck /finance/apache-nutch-1.2.rar
參考 http://www.cnblogs.com/i80386/p/3580107.html
這樣 把 這些 用戶賬號(hào) 分配并告知 使用者,并 告知 禁止使用root 和管理者用戶角色 并不可使用他人賬號(hào) 泞当,這樣就可以愉快的進(jìn)行 hdfs 的文件 權(quán)限管理了迹蛤,
尤其要注意 ,密碼不要太簡(jiǎn)單 ,因外要外網(wǎng)登陸盗飒,不然 被黑也是常事嚷量。
另外 hadoop的 acl 需要關(guān)注,未來也是需要 配置的逆趣,
http://www.reibang.com/p/2c8949340f6c
還要配置 hadoop的 ugi