我有一个java应用程序,它使用spark和hbase。我们需要找到部署在tomcat(jersey)中的url。所以,我们使用resteasy客户端来实现这一点。
当我使用rest-easy客户机执行一个独立的java代码来访问url时,它工作得很好
但是,当我在另一个使用spark进行某些处理的应用程序中使用相同的代码时,它会抛出标题中所示的错误。我在eclipse中使用maven作为构建工具。在构建它之后,我将创建一个可运行的jar并选择“将所需库提取到生成的jar”选项。对于执行应用程序,我使用以下命令:
nohup spark submit--主Yarn客户端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条答案
按热度按时间oug3syen1#
尝试更改resteasy客户端的版本,但没有起到任何作用。在编译时我可以看到这个类,为什么在运行时它会丢失呢
可能的原因可能是
1) 如果您使用的是maven,那么范围可能是
provided
. 这样你的jar就不会被复制到你的发行版上。您提到的上述配置排除了这一点。
2) 您没有从执行脚本指向正确的位置可能是shell脚本。
3) 你不能把这个jar
--jars
选项或--driverclasspath --executorclasspath
等。。。我怀疑这个问题是因为第二或第三个原因。
还可以看看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:冲浪者/泽西-普通-2.25。jar:surfer/hk2-api-2.5.0-b30.jar:冲浪者/泽西-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 againhere.csv文件
现在它抛出不同的异常:线程“main”java.lang.abstractmethoderror中的异常:javax.ws.rs.core.uribuilder.uri(ljava/lang/string;)ljavax/ws/rs/core/uribuilder;我还尝试在classpath中的某个地方搜索类响应$status$家族,而不是我提供的。我使用命令grep response$status$family.class/opt/mapr/spark/spark-1.4.1/lib/*.jar发现spark也有这个类。也许这就是问题所在。但是如何强制告诉jvm在运行时使用我提供的类而不是spark提供的类,我不知道!你能帮忙吗?
因为您在类路径中提供了外部jar
您可以使用以下选项告诉框架它必须使用您提供的外部jar。这可以通过两种方式实现
通过spark提交
配置集。。。
由于您使用的是1.4.1,请参阅配置选项
spark.executor.userClassPathFirst false
(实验)与spark.driver.userclasspathfirst的功能相同,但应用于executor示例。spark.driver.userClassPathFirst false
(实验性)在驱动程序中加载类时,是否让用户添加的jar优先于spark自己的jar。此功能可用于缓解spark的依赖关系和用户依赖关系之间的冲突。它目前是一个实验性功能。仅在群集模式下使用。可以用来告诉框架