2016-08-30 47 views
1

我們正在努力提升我們的系統在我們的春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.htmlSwitching 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(不起作用)。

回答

0

顯然,應用程序中的類路徑是空的,但添加了rt.jar。但是,由於在java8中腳本位於ext目錄中,因此不會將其添加到類路徑中。所以,我只是把這個路徑添加到CP。