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流式解释器所需的最低权限列表以及解释问题出现的原因仍然非常有价值。