使用cloudera CHD3u1 —— 使用eclipse plugin提交Job

轉自:http://heipark.iteye.com/blog/1178810 

Clouder CDH3B3 開始後hadoop.job.ugi不再生效,這意味着無法通eclipse plugin提交job和修改hdfs。


大家初次使用hadoop eclipse plugin一定在修改HDFS文件過程中出現過下面的錯誤


org.apache.hadoop.security.AccessControlException: Permission denied: user =test , access=WRITE, inode="pokes":hadoop:supergroup:rwxr-xr-x

 問題在於我當前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的公告:

 https://ccp.cloudera.com/display/CDHDOC/Incompatible+Changes 寫道:
The hadoop.job.ugi configuration no longer has any effect. Instead, please use the UserGroupInformation.doAs API to impersonate other users on a non-secured cluster. (As of CDH3b3)

 


cdh基於安全考慮建議如下方式提交job和修改hdfs:


創建一個kerberos用戶,這裏叫oozie(其實它是一個開源hadoop workflow框架),然後通過代理方式提交job,即,讓當前客戶端用戶模擬成oozie這個授權用戶做操作。

具體信息參考這裏:http://archive.cloudera.com/cdh/3/hadoop/Secure_Impersonation.pdf


這裏說下兩種基於試驗目的的獲取權限的方法:


  1. 關閉dfs權限管理,方法是修改hdfs-site.xml文件設置屬性dfs.permissions爲false;
  2. 通過代碼將當前用戶設置爲集羣管理者權限,這裏我設置當操作者爲hadoop,代碼如下:
Java代碼
  1. <SPAN><SPAN style="FONT-SIZE: small">UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hadoop");   
  2. try {   
  3.     ugi.doAs(new PrivilegedExceptionAction<Void>() {   
  4.         public Void run() throws IOException {   
  5.             Job job = new Job(initConf(), "tencent m/r");   
  6.             // do something   
  7.             System.exit(job.waitForCompletion(true) ? 0 : 1);   
  8.             return null;   
  9.         }   
  10.     });   
  11. catch (InterruptedException e) {   
  12.     e.printStackTrace();   
  13. }</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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章