spark应用程序抛出java.lang.NoSuchMethodError:javax.ws.rs.core.Response.readEntity(Ljava / lang / Class;)Ljava / lang / Object

时间:2017-01-07 12:29:50

标签: maven tomcat apache-spark hbase resteasy

我在java中有一个使用spark和hbase的应用程序。我们需要点击部署在tomcat(泽西岛)的网址。所以,我们使用resteasy客户端来做到这一点。

  

当我执行一个独立的java代码来使用rest-easy命中url时   客户端,它工作正常

但是,当我在另一个使用spark进行某些处理的应用程序中使用相同的代码时,它会抛出错误,如标题所示。 我在eclipse中使用maven作为构建工具。构建它之后,我正在创建一个可运行的jar并选择选项"将所需的库提取到生成的jar"中。为了执行应用程序,我使用命令:

  

nohup spark-submit --master yarn-client myWork.jar myProperties 0&

rest-easy客户端代码的依赖关系:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.11.Final</version>    
</dependency>
  </dependencies>

我无法弄清楚在编译期间,它不会抛出任何错误,但在运行时,虽然jar中包含了每个库(包括spark和hbase),但它会抛出错误,说不方法。请帮忙。

1 个答案:

答案 0 :(得分:2)

  

尝试更改resteasy-client的版本,但事实并非如此   救命。在编译期间我可以看到类,如何在运行时它   缺少

可能的原因可能是原因

1)如果您使用的是maven范围可能是provided。这样你的罐子就不会被复制到你的发行版了。

您已经提到的上述配置排除了这一点。

2)您没有从执行脚本指向正确的位置,可能是shell脚本。

3)你没有通过--jars选项或--driverclasspath --executorclasspath等传递此jar ...

我怀疑问题是由于第二或第三个原因。

另请查看https://spark.apache.org/docs/1.4.1/submitting-applications.html

编辑:

  

问题:spark-submit --conf   spark.driver.extraClassPath =冲浪/ javax.ws.rs-API-2.0.1.jar:冲浪者/ Jersey的客户端 - 2.25.jar:冲浪者/ Jersey的共2.25.jar:冲浪者/ HK2-API-2.5。 0-b30.jar:冲浪者/ Jersey的番石榴2.25.jar:冲浪者/ HK2-utils的-2.5.0-b30.jar:冲浪者/ HK2定位器-2.5.0-b30.jar:冲浪者/ javax.annotation- API-1.2.jar   artifact.jar againHere.csv

     

现在它引发了不同的异常:线程“main”中的异常   java.lang.AbstractMethodError:   javax.ws.rs.core.UriBuilder.uri(Ljava /郎/字符串;)Ljavax / WS / RS /型芯/ UriBuilder;   我也尝试过搜索Response $ Status $ Family课程   在类路径中的某个地方而不是我提供的东西。我用过   命令grep响应$ Status $ Family.class   /opt/mapr/spark/spark-1.4.1/lib/*.jar我发现火花也有   这个班。可能是这个问题。但如何有力地告诉   jvm在运行时使用我提供的类而不是spark的类,   我不知道!你能帮忙吗?

由于您在类路径中提供了外部jar

您可以使用以下选项告诉框架它必须使用您提供的外部jar。这可以通过两种方式完成

  1. 通过spark submit
  2. conf.set ...
  3. 由于您使用的是1.4.1,请参阅configuration options

      

    spark.executor.userClassPathFirst false(实验)相同   功能如spark.driver.userClassPathFirst,但适用于   执行者实例。

         

    spark.driver.userClassPathFirst false(实验)是否给予   用户添加的jar在加载类时优先于Spark自己的jar   在司机。此功能可用于缓解冲突   Spark的依赖关系和用户依赖关系之间。它目前是一个   实验特征。这仅在群集模式下使用。可以使用   告诉框架