2

我正嘗試使用Hadoop流式傳輸使用私有Python解釋器(Hortonworks數據平臺2.2.0)。 python解釋器是私人的,因爲它是主目錄中的虛擬環境解釋器,只有特定的用戶帳戶纔有權運行它。Hadoop使用私有Python解釋器流式傳輸

我在hashbang行中指定了python解釋器。我的流式作業可與系統python或#!/usr/bin/env python一起使用。然而,它產生權限被拒絕錯誤,當我使用專用的Python解釋器: #!/home/dmazur/test/tempenv/bin/python

下面是輸出的一個片段,顯示錯誤消息:

15/11/03 11:31:13 INFO mapreduce.Job: map 0% reduce 0% 
15/11/03 11:31:22 INFO mapreduce.Job: Task Id : attempt_1440596114865_0249_m_000000_0, Status : FAILED 
Error: java.lang.RuntimeException: Error in configuring object 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109) 
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:75) 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:446) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:106) 
    ... 9 more 
Caused by: java.lang.RuntimeException: Error in configuring object 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109) 
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:75) 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133) 
    at org.apache.hadoop.mapred.MapRunner.configure(MapRunner.java:38) 
    ... 14 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:106) 
    ... 17 more 
Caused by: java.lang.RuntimeException: configuration exception 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:222) 
    at org.apache.hadoop.streaming.PipeMapper.configure(PipeMapper.java:66) 
    ... 22 more 
Caused by: java.io.IOException: Cannot run program "/gs/hadoop/yarn/local/lm-2r01-n10/usercache/dmazur/appcache/application_1440596114865_0249/container_1440596114865_0249_01_000002/./mapper_mean.py": error=13, Permission denied 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:209) 
    ... 23 more 
Caused by: java.io.IOException: error=13, Permission denied 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:186) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) 
    ... 24 more 

我相信問題是權限上python解釋器而不是mapper_mean.py文件。當更改hashbang行而不更改文件本身的權限時,作業運行良好。我想這意味着MapReduce作業由另一個用戶擁有的守護進程運行。我沒有看到有關如何使用私有解釋器進行Hadoop流式傳輸的文檔中的任何內容。可能嗎?如果是這樣,需要設置哪些權限才能運行?

回答

0

爲了運行這樣的工作,你需要一個運行可執行文件/ home/dmazur/test/tempenv/bin/python的權限的用戶,並且還有權啓動hadoop作業。 那麼它應該會很好。

+0

感謝您的建議。在這種情況下,用戶有權運行可執行文件,並且還啓動Hadoop作業。顯然有一些額外的權限需要,因爲在問題中描述的錯誤。理想情況下,我希望獲得使用Hadoop流式解釋器所需的權限列表。 –

0

此問題可以通過將虛擬環境移動到新目錄並設置權限以便所有用戶都可以執行來解決。

我測試了這個,它允許我使用虛擬環境。然而,這不是一個令人滿意的解決方案,因爲可能存在隱私/安全問題,因爲解釋器對所有用戶都是可讀/可執行的。因此,獲得Hadoop流式解釋器所需的最低權限列表以及解釋問題出現的原因仍然非常有價值。