2016-08-30 3 views
1

Мы пытаемся обновить нашу систему, чтобы использовать Java 8 вместо Java 7.двигателя Javascript (Nashorn) не распознается с Java 8, вызываемой из весенне-Hadoop

На какой конфигурации процесса в нашем Spring-Hadoop XML , у нас есть определение предварительного действия, которое фактически является скриптом 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> 

А вот содержание скриптов/Prepare-окна-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: Нет подходящий двигатель найдено для расширения JS на 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) в орг. 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: Нет подходящего двигатель найден для языка Java- на 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) at org.springframework.data.hadoop.scripting.HdfsScriptRunner.call (HdfsScriptRunner.java:68) at 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.