javascript引擎(nashorn)不能被从springhadoop调用的java8识别

2ul0zpep  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(524)

我们正在尝试升级我们的系统以使用Java8而不是Java7。
在springhadoopxml中的一些进程配置中,我们有一个pre-action的定义,它实际上是一个javascript脚本。
对于Java7,它可以正常工作,但是当将java版本更改为Java8时,在尝试运行此进程时会引发异常(请参阅下面的堆栈跟踪)。
我看到Java8使用了与Java6或Java7不同的引擎来运行javascript代码(nashorn而不是rhino)。好像这个引擎能用-我试过jss了(http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html)实用性和它的工作非常好。
以下是我的xml(相关部分):

<hdp:script id="prepare-hdfs" location="scripts/prepare-windows-hdfs.js"/>

    <bean id="runner" class="org.springframework.data.hadoop.mapreduce.JobRunner">
        <property name="runAtStartup" value="true" />
        <property name="waitForCompletion" value="false"/>
        <property name="killJobAtShutdown" value="false"/>
        <property name="preAction">
            <list>
                <ref bean="prepare-hdfs" />
            </list>
        </property>
        <property name="jobs">
            <list>
                <ref bean="my-job" />
            </list>
        </property>
    </bean>

下面是scripts/prepare-windows-hdfs.js文件的内容:

if (java.lang.System.getProperty("os.name").startsWith("Windows")) {
    // 0655 = -rwxr-xr-x
     org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_DIR_PERMISSION.fromShort(0655)
     org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_FILE_PERMISSION.fromShort(0655)
}

我试图在脚本开头添加以下行:

try {load("nashorn:mozilla_compat.js");} catch (e) {} // for Java 8

如中所述http://docs.spring.io/autorepo/docs/spring-hadoop/2.2.1.release/reference/html/springandhadoop-fs.html 从犀牛变成了纳索恩,但没用。
我试着使用内联脚本。即。:

<hdp:script id="prepare-hdfs" language="javascript" >
    // 'hack' default permissions to make Hadoop work on Windows
    try {load("nashorn:mozilla_compat.js");} catch (e) {} // for Java 8

    if (java.lang.System.getProperty("os.name").startsWith("Windows")) {
        // 0655 = -rwxr-xr-x
        org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_DIR_PERMISSION.fromShort(0655)
        org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_FILE_PERMISSION.fromShort(0655)
    }
</hdp:script>

然而,这也无济于事。
以下是引发的异常:
原因:java.lang.illegalargumentexception:在org.springframework.util.assert.notnull(assert)中找不到适用于扩展js的引擎。java:112)位于org.springframework.data.hadoop.scripting.jsr223scriptevaluator.discoverengine(jsr223scriptevaluator)。java:101)在org.springframework.data.hadoop.scripting.jsr223scriptevaluator.evaluate(jsr223scriptevaluator)。java:74)在org.springframework.data.hadoop.scripting.jsr223scriptrunner.call(jsr223scriptrunner。java:75)在org.springframework.data.hadoop.scripting.hdfscriptrunner.call(hdfscriptrunner。java:68)在org.springframework.data.hadoop.mapreduce.jobrunner.invoke(jobrunner。java:88)在org.springframework.data.hadoop.mapreduce.jobrunner.call(jobrunner。java:51)在org.springframework.data.hadoop.mapreduce.jobrunner.afterpropertiesset(jobrunner。java:44)在org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitmethods(abstractautowirecapablebeanfactory)。java:1477)位于org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory)。java:1417) ... 20多个
或:
原因:java.lang.illegalargumentexception:在org.springframework.util.assert.notnull(assert)中找不到适合javascript语言的引擎。java:112)位于org.springframework.data.hadoop.scripting.jsr223scriptevaluator.discoverengine(jsr223scriptevaluator)。java:101)在org.springframework.data.hadoop.scripting.jsr223scriptevaluator.evaluate(jsr223scriptevaluator)。java:74)在org.springframework.data.hadoop.scripting.jsr223scriptrunner.call(jsr223scriptrunner。java:75)在org.springframework.data.hadoop.scripting.hdfscriptrunner.call(hdfscriptrunner。java:68)在org.springframework.data.hadoop.mapreduce.jobrunner.invoke(jobrunner。java:88)在org.springframework.data.hadoop.mapreduce.jobrunner.call(jobrunner。java:51)在org.springframework.data.hadoop.mapreduce.jobrunner.afterpropertiesset(jobrunner。java:44)在org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitmethods(abstractautowirecapablebeanfactory)。java:1477)位于org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory)。java:1417) ... 20多个
我使用的确切jdk是:jdk1.7.0_79.x86_64(工作)和jdk1.8.0_92.x86_64(不工作)。

2mbi3lxu

2mbi3lxu1#

显然,类路径在应用程序中为空,但是添加了rt.jar。但是,由于在java8中脚本位于ext目录中,因此它们没有添加到类路径中。所以,我把这个路径添加到cp。

相关问题