使用私有 python 解释器的 Hadoop 流式传输

Posted

技术标签:

【中文标题】使用私有 python 解释器的 Hadoop 流式传输【英文标题】:Hadoop streaming with private python interpreter 【发布时间】:2015-11-03 17:11:38 【问题描述】:

我正在尝试将 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_mean.py 文件。在更改 hashbang 行而不更改文件本身的权限时,作业运行良好。我想这意味着 MapReduce 作业由另一个用户拥有的守护进程运行。我在文档中没有看到任何关于如何使用私有解释器进行 Hadoop 流式传输的内容。是否可以?如果是这样,需要设置什么权限才能让它运行?

【问题讨论】:

【参考方案1】:

要运行这样的作业,您需要一个有权运行可执行文件 /home/dmazur/test/tempenv/bin/python 并且还具有启动 hadoop 作业的权限的用户。 那么它应该会没事的。

【讨论】:

感谢您的建议。在这种情况下,用户具有运行可执行文件的权限,并且还在启动 Hadoop 作业。由于问题中描述的错误,显然需要一些额外的权限。理想情况下,我希望获得将解释器与 Hadoop 流结合使用所需的权限列表。【参考方案2】:

这个问题可以通过将虚拟环境移动到一个新目录并设置权限以便所有用户都可以执行来解决。

我已经对此进行了测试,它允许我使用虚拟环境。然而,这不是一个令人满意的解决方案,因为使解释器对所有用户都可读/可执行可能存在隐私/安全问题。因此,拥有 Hadoop 流解释器所需的最低权限列表以及对问题出现原因的解释仍然非常有价值。

【讨论】:

以上是关于使用私有 python 解释器的 Hadoop 流式传输的主要内容,如果未能解决你的问题,请参考以下文章

python之类的相关名词解释

015-Python提高01-GIL拷贝私有

查看私有仓库镜像python脚本

python 里面的单下划线与双下划线的区别(私有和保护)

《python解释器源码剖析》第11章--python虚拟机中的控制流

1.0Python虚拟环境创建与管理