Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Redux:在Hadoop中运行时,我如何让Jython在自己的jar文件中使用存储在Lib中的Python模块?_Java_Python_Hadoop_Jython - Fatal编程技术网

Java Redux:在Hadoop中运行时,我如何让Jython在自己的jar文件中使用存储在Lib中的Python模块?

Java Redux:在Hadoop中运行时,我如何让Jython在自己的jar文件中使用存储在Lib中的Python模块?,java,python,hadoop,jython,Java,Python,Hadoop,Jython,我正在尝试将Jython用于Hadoop 1.2.1中的一个实现。除了陈旧的项目(比如code.google.com/p/happy)和$Hadoop\u HOME/src/examples/python/WordCount.py中陈旧的实现之外,我对Jython+Hadoop的了解非常少,所以也许我一开始就找错了方向。。。但这似乎是合理和可能的。我也非常了解Hadoop流,通过它我可以在Hadoop中使用Python,而不必使用Jython,但这不是我在这里要做的 基本上,当我使用java-j

我正在尝试将Jython用于Hadoop 1.2.1中的一个实现。除了陈旧的项目(比如code.google.com/p/happy)和
$Hadoop\u HOME/src/examples/python/WordCount.py
中陈旧的实现之外,我对Jython+Hadoop的了解非常少,所以也许我一开始就找错了方向。。。但这似乎是合理和可能的。我也非常了解Hadoop流,通过它我可以在Hadoop中使用Python,而不必使用Jython,但这不是我在这里要做的

基本上,当我使用
java-jar/full/path/to/myjythonjar.jar
调用嵌入式/独立JythonJAR文件时,
/full/path/to/myjythonjar.jar/Lib
在我的Python
sys.path
中,但是当我使用
bin/hadoop-jar/full/path/to/myjythonjar.jar输入输出调用时,
…jar/Lib
不在我的路径中,脚本找不到我正在引用的Python模块

这是我正在做的

我使用的是Jython jar的独立版本,使用的是
JarRunner
界面,大致如前所述和其他地方;基本上如下:

 cp jython-standalone-2.7-b1.jar jythonsalib_test.jar  
 jar ufe jythonsalib_test.jar org.python.util.JarRunner __run__.py  
也就是说,复制一个独立jar,添加名为
\uuuuu run\uuuuu.py
的脚本,并将清单更改为执行
JarRunner
——非常感谢@Frank Wierzbicki

当我直接运行时,这一切都很好,例如

java -jar jythonsalib_test.jar
我的
sys.path
报告它包含
'/full/path/to/jar/file/jythonsalib\u test.jar/Lib'
,这正是我所期望的,也是我获取Python模块的路径(根据经验,通过将
sys.path
设置为空列表(失败),只有该路径(工作))

当我在Hadoop中运行同一个jar时,例如

bin/hadoop jar /full/path/to/jar/file/jythonsalib_test.jar input output
sys.path
仅包括

['__classpath__', '__pyclasspath__']
我还使用了Jython独立jar版本2.5.4-rc1(具有上述相同的行为)和2.5.3(由于不相关的原因,这对我来说不起作用)

正如在其他SO答案中指出的,我目前使用的解决方法基本上是直接将我的jar的Lib目录添加到Jython脚本中,如

import sys
sys.path.append('/full/path/to/jar/file/jythonsalib_test.jar/Lib')

这基本上是可行的——但这是一个分布式应用程序!我无法以这种方式引用任何路径。其他的SO文章建议了各种机制,但基本上都是添加到库路径(同样,没有链接,因为我有我想知道用OneJar打包你的应用程序是否会有所改进。请尝试并报告。我只是在这里瞎猜。

Hadoop(运行MR1作业的版本2.6.0-cdh5.4.2)+Jython(版本2.7.0)只有在启动阶段才有这个问题:也就是说,当
main
Tool
代码运行时,Jython的
sys.prefix
null
,并且
sys.path
不包含所需的
/path/to/jarfile.jar/Lib
条目,从而产生错误消息。在远程映射程序代码中,
>系统路径
设置正确

一种选择是只在远程映射器和还原器中使用Jython

如果需要在启动阶段运行Jython,可以手动编辑
sys.path
(在第一次调用
PythonInterpreter
之前)

见(或其他地方)对于
pathToJar
技巧,如果您首先查看
pathToJar
,您可能会认为它不起作用,因为当您在Hadoop中运行它时,您实际上会在临时目录中获得分解jar的路径,而不是原始jar文件。这没关系:这个分解目录有一个
Lib
目录和Jython p把爆炸的那一个粘起来,而不是震坏的那一个


最后,我还假设您原来的job jar是一个依赖于jython standalone的
jar
,不包括
hadoop核心的
jar,这与hadoop job jar通常的情况相同。

您的问题太长了。任何人都很难回答。我建议将其分解和/或问什么是“最”相关的。@Siddharth您希望它缺少细节吗?我认为这是一个非常好的描述性问题,我感谢hoc_age为此付出的努力(特别是第一个问题!).我也是。我认为@hoc_age对我们的社区来说是如此成熟,并且感谢他投入的时间。也就是说,我想提醒他,人们通常不会阅读如此冗长和信息密集的问题。如果考虑一下将其细分,他会得到更好的答案。你同意吗?事实上,我同意你们两人的看法@{Siddharth,bjb568}但不能同时标记你们两个。我试图预先加载重要信息,并以粗体问题结束,以尽量减少痛苦的解析。正如我在我的文章中提到的,我多年来一直是一个潜伏者,非常欣赏简洁。谢谢你的温柔提醒。我的问题由于其他原因而存在缺陷。如果有人有想法,我仍在倾听;但另一个,更简短,问题就要来了。。。
String pathToJar = getClass().getProtectionDomain().getCodeSource().getLocation().getPath().toString();
PySystemState sys = Py.getSystemState;
sys.path.insert(0, new PyString(pathToJar));