我正在尝试使用hadoop流和一个私有python解释器(hortonworks数据平台2.2.0)。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\u mean.py文件。当更改hashbang行而不更改文件本身的权限时,作业运行正常。我想这意味着mapreduce作业由另一个用户拥有的守护进程运行。我在文档中没有看到任何关于如何使用hadoop流的私有解释器的内容。有可能吗?如果是这样,需要设置哪些权限才能让它运行?
2条答案
按热度按时间ivqmmu1c1#
为了运行这样一个作业,你需要一个拥有运行可执行文件/home/dmazur/test/tempenv/bin/python的权限的用户,同时还需要有启动hadoop作业的权限。那就没事了。
a5g8bdjr2#
这个问题可以通过将虚拟环境移动到一个新目录并设置权限来解决,这样所有用户都可以执行它。
我已经测试过了,它允许我使用虚拟环境。然而,这不是一个令人满意的解决方案,因为使解释器对所有用户可读/可执行可能存在隐私/安全问题。因此,有一个hadoop流解释器所需的最低权限列表以及对问题产生原因的解释仍然是非常有价值的。