看來(lái)你是開啟了hdfs的權(quán)限檢查功能,這樣你訪問(wèn)hdfs,namenode都會(huì)檢查訪問(wèn)用戶的權(quán)限的。
你現(xiàn)在想要修改/process/startall.txt文件的權(quán)限,那process目錄以及startall.txt的有效用戶、有效組以及其權(quán)限是什么呢?
假設(shè)process目錄與startall.txt原始的有效用戶和有效組分別為root和supergroup,原始權(quán)限為750的話,你若在自己電腦運(yùn)行上述程序,它會(huì)自動(dòng)獲取當(dāng)前計(jì)算機(jī)的登錄用戶,假設(shè)為wyc,去訪問(wèn)hdfs,很顯然,你的程序連process目錄都進(jìn)不去的。
此外,想要更改一個(gè)目錄或文件的權(quán)限,當(dāng)前用戶則必須是有效用戶或超級(jí)用戶才可以。
想要解決的話,嘿嘿, 如果你設(shè)置的hadoop.security.authentication property,也就是認(rèn)證方式為simple的話(默認(rèn)就是simple),那還可以鉆該認(rèn)證方式的空子,運(yùn)行程序是偽裝成有效用戶或者超級(jí)用戶即可。
此外,有一行代碼需要修改一下,我在實(shí)驗(yàn)后發(fā)現(xiàn)設(shè)置權(quán)限那一行有誤,如下:
//hdfs.setpermission(dstpath, new fspermission((short) 775));
hdfs.setpermission(dstpath, new fspermission("755"));