我們正在努力提升我們的系統在我們的春Hadoop的XML使用Java 8,而不是Java 7中Javascript引擎(犀牛)不與Java 8從彈簧的Hadoop稱爲
在一些工藝配置認可,我們有一個實際上是JavaScript腳本的預執行的定義。
對於Java 7,它可以正常工作,但在將java版本更改爲java 8時,嘗試運行此過程時會引發異常(請參閱下面的堆棧跟蹤)。
我看到Java 8使用與Java 6或7不同的引擎來運行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>
而這裏的腳本的內容/準備 - - 窗口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和Switching from Rhino to Nashorn但它沒有幫助。
我試圖使用內聯腳本。即:
<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.java:112)發現擴展JS在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.discoverEngine(Jsr223ScriptEvaluator.java:101) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.evaluate(Jsr223ScriptEvaluator.java:74) 在 有機springframework.data.hadoop.scripting.Jsr223ScriptRunner.call(Jsr223S criptRunner.java:75) 在 org.springframework.data.hadoop.scripting.HdfsScriptRunner.call(HdfsScriptRunner.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(AbstractAu towireCapableBeanFactory.java:1417) ...20更
或:
所致:java.lang.IllegalArgumentException異常:沒有合適的發動機 找到的語言的javascript 在org.springframework.util.Assert.notNull(Assert.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(Jsr223ScriptR unner.java:75) 在org.springframework.data.hadoop.scripting.HdfsScriptRunner.call(HdfsScriptRunner.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(works)和jdk1.8.0_92.x86_64(不起作用)。