2017-04-20 1 views
0
java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaMirrors$JavaMirror; 
    at org.elasticsearch.spark.serialization.ReflectionUtils$.org$elasticsearch$spark$serialization$ReflectionUtils$$checkCaseClass(ReflectionUtils.scala:42) 
    at org.elasticsearch.spark.serialization.ReflectionUtils$$anonfun$checkCaseClassCache$1.apply(ReflectionUtils.scala:84) 

il semble scala version non compatibles, mais je vois le document d'étincelle, étincelle 2.10 et 2.11.8 scala est ok. C'est mon pom.xml et c'est juste un test pour spark pour écrire sur elasticsearch avec es-hadoop, je n'ai aucune idée de comment résoudre cette exception. `java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>cn.jhTian</groupId> 
    <artifactId>sparkLink</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>${project.artifactId}</name> 
    <description>My wonderfull scala app</description> 
    <inceptionYear>2015</inceptionYear> 
    <licenses> 
     <license> 
      <name>My License</name> 
      <url>http://....</url> 
      <distribution>repo</distribution> 
     </license> 
    </licenses> 

    <properties> 
     <encoding>UTF-8</encoding> 
     <scala.version>2.11.8</scala.version> 
     <scala.compat.version>2.11</scala.compat.version> 

    </properties> 

    <repositories> 
     <repository> 
      <id>ainemo</id> 
      <name>xylink</name> 
      <url>http://10.170.209.180:8081/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 

    <dependencies> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-core_2.11</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-client</artifactId> 
      <version>2.6.4</version><!-- 2.64 --> 
     </dependency> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-library</artifactId> 
      <version>${scala.version}</version> 
     </dependency> 
     <!--<dependency>--> 
      <!--<groupId>org.scala-lang</groupId>--> 
      <!--<artifactId>scala-compiler</artifactId>--> 
      <!--<version>${scala.version}</version>--> 
     <!--</dependency>--> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-reflect</artifactId> 
      <version>${scala.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-hdfs</artifactId> 
      <version>2.6.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-streaming_2.11</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-streaming-kafka-0-8_2.11</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.protobuf</groupId> 
      <artifactId>protobuf-java</artifactId> 
      <version>3.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.elasticsearch</groupId> 
      <artifactId>elasticsearch-hadoop</artifactId> 
      <version>5.3.0 </version> 
     </dependency> 

     <!-- Test --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.specs2</groupId> 
      <artifactId>specs2-core_${scala.compat.version}</artifactId> 
      <version>2.4.16</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.scalatest</groupId> 
      <artifactId>scalatest_${scala.compat.version}</artifactId> 
      <version>2.2.4</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project>' 

c'est mon code

import org.apache.spark.{SparkConf, SparkContext} 
import org.elasticsearch.spark._ 

/** 
    * Created by jhTian on 2017/4/19. 
    */ 
object EsWrite { 
    def main(args: Array[String]) { 
    val sparkConf = new SparkConf() 
     .set("es.nodes", "1.1.1.1") 
     .set("es.port", "9200") 
     .set("es.index.auto.create", "true") 
     .setAppName("es-spark-demo") 
    val sc = new SparkContext(sparkConf) 
    val job1 = Job("C开发工程师","http://job.c.com","c公司","10000") 
    val job2 = Job("C++开发工程师","http://job.c++.com","c++公司","10000") 
    val job3 = Job("C#开发工程师","http://job.c#.com","c#公司","10000") 
    val job4 = Job("Java开发工程师","http://job.java.com","java公司","10000") 
    val job5 = Job("Scala开发工程师","http://job.scala.com","java公司","10000") 
// val numbers = Map("one" -> 1, "two" -> 2, "three" -> 3) 
// val airports = Map("arrival" -> "Otopeni", "SFO" -> "San Fran") 
// val rdd=sc.makeRDD(Seq(numbers,airports)) 
    val rdd=sc.makeRDD(Seq(job1,job2,job3,job4,job5)) 
    rdd.saveToEs("job/info") 
    sc.stop() 
    } 

} 
case class Job(jobName:String, jobUrl:String, companyName:String, salary:String)' 

Répondre

1

En général NoSuchMethodError implique l'appelant a été compilé avec une version différente de celle a été trouvée sur le chemin de classe lors de l'exécution (ou si vous avez plusieurs versions du CP).

Dans votre cas, je suppose que es-hadoop est construit sur une version différente de Scala Je n'ai pas utilisé maven depuis un petit moment, mais je pense que la commande dont vous avez besoin est mvn depdencyTree. Utilisez la sortie pour voir quelle version de Scala es-hadoop est construite avec, puis configurez votre projet pour utiliser la même version de Scala.

Pour obtenir je builds serais stable/reproductible recommande d'utiliser quelque chose comme le maven-enforcer-plugin:

<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-enforcer-plugin</artifactId> 
       <version>1.4.1</version> 
       <executions> 
        <execution> 
         <id>enforce</id> 
         <configuration> 
          <rules> 
           <dependencyConvergence /> 
          </rules> 
         </configuration> 
         <goals> 
    <goal>enforce</goal> 
    </goals> 
</execution> 
</executions> 
</plugin> 

il peut être gênant au départ, mais une fois que vous avez toutes vos dépendances triées vous ne devriez pas avoir des problèmes comme ça.

+0

je fais comme u dire et de constater que es-Hadoop 5.0+ dépendent de scala-core_2.10, mais mon scala- env core est 2.11, et si es-hadoop 5.0+ supporte simplement scala-core2.10 et non pour 2.11. –

+0

désolé l'up scala-core_2.11 devrait être spark-core_2.11 et l'image depdencyTree ici: [link] (http://i2.muimg.com/567571/d56aa721c8f70946.png) si je dois changer mon env scala à 2.10 pour spark-core_2.10? –

+0

déjà changer ma version env scala à 2.10 et spark-core_2.10 mais le problème reste ici –

0

utilisation dépendance comme ce

<dependency> 
      <groupId>org.elasticsearch</groupId> 
      <artifactId>elasticsearch-spark-20_2.11</artifactId> 
      <version>5.2.2</version> 
     </dependency> 

étincelle 2.0 et 2.11 scala