【问题标题】:spark application has thrown java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Objectspark 应用程序抛出了 java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object
【发布时间】:2017-05-22 03:29:48
【问题描述】:

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

当我使用 rest-easy 执行一个独立的 java 代码来访问 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 的库),但它会抛出错误,说没有方法。请帮忙。

【问题讨论】:

  • 您使用的是哪个版本的 spark?
  • 这显然是版本不匹配错误。这个答案可能会有所帮助:stackoverflow.com/questions/24139097/…
  • 火花版本 = 1.4.1
  • 我曾尝试更改 resteasy-client 的版本,但没有帮助。在编译时我可以看到这个类,为什么在运行时它丢失了,即使我已经打包了所有的库。?

标签: maven tomcat apache-spark hbase resteasy


【解决方案1】:

曾尝试更改 resteasy-client 的版本,但没有 帮助。在编译时我可以看到这个类,它是如何在运行时出现的 不见了

可能的原因可能是原因

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

你上面提到的配置排除了这个。

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

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

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

也可以看看https://spark.apache.org/docs/1.4.1/submitting-applications.html

编辑:

问题:spark-submit --conf spark.driver.extraClassPath=surfer/javax.ws.rs-api-2.0.1.jar:surfer/jersey-client-2.25.jar:surfer/jersey-common-2.25.jar:surfer/hk2-api-2.5。 0-b30.jar:surfer/jersey-guava-2.25.jar:surfer/hk2-utils-2.5.0-b30.jar:surfer/hk2-locator-2.5.0-b30.jar:surfer/javax.annotation- api-1.2.jar artifact.jar 再次Here.csv

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

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

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

  1. 通过火花提交
  2. conf.set...

由于您使用的是 1.4.1,请参阅 configuration options

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

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

【讨论】:

  • 我在 Eclipse 中使用 maven 作为构建工具。构建它之后,我正在创建一个可运行的 jar 并选择选项“将所需的库提取到生成的 jar 中”。在应用程序 jar 中,我还可以看到类 'Response' 和 readEntity 方法。
  • 好的,你是如何提交作业的,那么你可以打印提交命令吗?我在这里看不到 --jars 选项,我猜它采用了不存在该方法的旧 jar 文件。
  • 你的myWork.jar 是超级罐子吗?我在上述问题中看不到 --jars 选项。
  • 是的,我没有提供 --jars 选项,因为我已将 resteasy 库提取到 jar 本身中。
  • 我也尝试过使用 --jars 选项。它适用于我在外部提供的其他一些库,例如 poi.jar。但它不适用于 javax.ws.rs.core。
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多