Clouder CDH3B3 開始後hadoop.job.ugi不再生效,這意味着無法通eclipse plugin提交job和修改hdfs。
大家初次使用hadoop eclipse plugin一定在修改HDFS文件過程中出現過下面的錯誤
問題在於我當前OS用戶名爲“test”,這個值是hadoop通過 System.getProperty("user.name") 獲取的,如果當前用戶名和HDFS文件所屬用戶名不一致,修改HDFS文件時則會報AccessControlException,怎麼解決呢?辦法是修改hadoop插件的“hadoop.job.ugi”屬性爲"hadoop,hadoop"就可以了,告訴hdfs我當前就是hadoop用戶,這個屬性也可以在代碼裏設置。
最近部署了一個CDH版本Hadoop集羣,首先發現的是它的eclipse plugin和Apache hadoop plugin不兼容,需要手工編譯(這個jar文件在這裏可以下到:http://heipark.iteye.com/admin/blogs/1178756),接着發現hadoop plugin屬性配置頁面沒有hadoop.job.ugi配置項了,在代碼中設置也不好使,還是報AccessControlException。出現什麼情況呢?看看cloudera的公告:
cdh基於安全考慮建議如下方式提交job和修改hdfs:
創建一個kerberos用戶,這裏叫oozie(其實它是一個開源hadoop workflow框架),然後通過代理方式提交job,即,讓當前客戶端用戶模擬成oozie這個授權用戶做操作。
具體信息參考這裏:http://archive.cloudera.com/cdh/3/hadoop/Secure_Impersonation.pdf
這裏說下兩種基於試驗目的的獲取權限的方法:
- 關閉dfs權限管理,方法是修改hdfs-site.xml文件設置屬性dfs.permissions爲false;
- 通過代碼將當前用戶設置爲集羣管理者權限,這裏我設置當操作者爲hadoop,代碼如下:
- <SPAN><SPAN style="FONT-SIZE: small">UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hadoop");
- try {
- ugi.doAs(new PrivilegedExceptionAction<Void>() {
- public Void run() throws IOException {
- Job job = new Job(initConf(), "tencent m/r");
- // do something
- System.exit(job.waitForCompletion(true) ? 0 : 1);
- return null;
- }
- });
- } catch (InterruptedException e) {
- e.printStackTrace();
- }</SPAN></SPAN>
UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hadoop");
try {
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws IOException {
Job job = new Job(initConf(), "tencent m/r");
// do something
System.exit(job.waitForCompletion(true) ? 0 : 1);
return null;
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}