2016-08-12 178 views
0

首先介紹一點背景知識。 我有一個測試CDH羣集,有兩個節點。我正在嘗試執行Oozie作業,下載文件,使用SPARK處理它,然後在Solr中對其進行索引。在Hadoop上運行的Oozie作業問題 -/user/history/done_intermediate上的權限

羣集被配置爲使用Kerberos身份驗證。 的CDH版本是5.7.1

當我嘗試運行與Oozie的工作,使用以下命令:

oozie job --oozie https://host:11443/oozie/ -run --config oozieExample/job.properties 

它失敗,出現以下異常:

2016-08-12 12:29:40,415 WARN org.apache.oozie.action.hadoop.JavaActionExecutor: SERVER[it4364-cdh01.novalocal] USER[centos] GROUP[-] TOKEN[] APP[stackOverflow] JOB[0000012-160808110839555-oozie-clou-W] ACTION[[email protected]_Current_Data] Exception in check(). Message[JA017: Could not lookup launched hadoop Job ID [job_1470672690566_0027] which was associated with action [[email protected]_Current_Data]. Failing this action!] 
org.apache.oozie.action.ActionExecutorException: JA017: Could not lookup launched hadoop Job ID [job_1470672690566_0027] which was associated with action [[email protected]_Current_Data]. Failing this action! 
     at org.apache.oozie.action.hadoop.JavaActionExecutor.check(JavaActionExecutor.java:1277) 
     at org.apache.oozie.command.wf.ActionCheckXCommand.execute(ActionCheckXCommand.java:182) 
     at org.apache.oozie.command.wf.ActionCheckXCommand.execute(ActionCheckXCommand.java:56) 
     at org.apache.oozie.command.XCommand.call(XCommand.java:286) 
     at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:175) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 

隨着快速谷歌搜索,似乎發生這種情況時,作業歷史記錄服務器沒有運行,或無法檢測作業的中間目錄。

當歷史目錄執行ls命令,我有以下幾點:

[[email protected] ~]$ hadoop fs -ls /user/history 
Found 2 items 
drwxrwx--- - mapred hadoop   0 2016-08-12 10:36 /user/history/done 
drwxrwxrwt - mapred hadoop   0 2016-08-12 12:29 /user/history/done_intermediate 

這是確定的,我猜。理論上,根據CDH文檔,mapred用戶應該是歷史文件夾的所有者。

然而,當我檢查done_intermediate的內容:

[[email protected] ~]$ hadoop fs -ls /user/history/done_intermediate 
Found 1 items 
drwxrwx--- - centos hadoop   0 2016-08-12 12:29 /user/history/done_intermediate/centos 

這意味着用戶centos(一個執行Oozie的工作)是這個目錄的所有者。這可以防止作業歷史記錄服務器讀取文件,爲完成標記作業,然後,Oozie的將其標記爲失敗。日誌指出正是這一點:

<ommited for brevity> 
... 
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=mapred, access=READ_EXECUTE, inode="/user/history/done_intermediate/centos":centos:hadoop:drwxrwx--- 
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:281) 
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:262) 
... 
<ommited for brevity> 

如果我改變對歷史文件夾中所有內容的所有權,與hadoop fs -ls -R /user/history歷史服務器識別的工作,將其標記爲已完成。

我試圖運行作業的mapred用戶,更改屬性文件的工作,然而,這也失敗了,現在因爲mapred用戶沒有權限對內部HDFS /users文件夾寫的,所以它看起來這不是正確的解決方案。

是否有一些配置可以避免centosmapred之間的歷史文件夾中的用戶衝突?

在此先感謝

+0

這個設置應該可行 - 如果'mapred'用戶確實是'hadoop'組的成員。您可以嘗試爲'mapred @ YOUR.REALM'創建Kerberos票據,然後運行'hdfs groups'以確保? –

+0

謝謝@SamsonScharfrichter。我有兩個問題。首先,映射的用戶不存在於用於Kerberos的Active Directory上。其次,用戶不在正確的組中。確定作業運行後沒有問題。你可以發表這個評論作爲答案,所以我可以接受它嗎? –

回答

1

長話短說:作業歷史日誌收集這個特定HDFS權限問題可能有不同的根源......

  1. 系統帳戶mapred無法通過「組來解決映射」規則
    (默認配置=>映射上的NameNode主機上的本地Linux用戶Hadoop的用戶名,並檢索它們的Linux組 - 但反過來Linux的用戶/組可以被綁定到AD,OpenLDAP的等)
  2. 系統帳戶mapred可以解決的,但不是必需的hadoop系統組(成員...)
  3. hdfs:///user/history/子目錄中的權限因某些未知原因而被搞亂 - 例如, 「粘性位」從tT切換而不通知

類似的問題是在該職位描述:historyserver not able to read log after enabling kerberos(診斷爲原因#2)

PS:我提到的「粘滯位」翻轉(原因#3)出於個人經驗。順便提一下,仍然對導致改變的原因感到困惑。

+0

是的,你也應該在namenode上映射用戶。還將mapred用戶添加到hadoop組 – snow04