Apache spark 替换默认情况下导入的Spark'库;s类路径
我目前正在Spark 2.1.0的一个项目中工作,我需要导入一个Spark本身已经依赖的库。特别是,我想用Apache spark 替换默认情况下导入的Spark'库;s类路径,apache-spark,gradle,dependency-management,Apache Spark,Gradle,Dependency Management,我目前正在Spark 2.1.0的一个项目中工作,我需要导入一个Spark本身已经依赖的库。特别是,我想用org.roaringbitmap:roaringbitmap:0.7.42替换org.roaringbitmap:roaringbitmap:0.5.11(org.apache.spark:spark-core_2.11:2.1.0.cloudera1和org.apache.spark:spark-sql_2.11:2.1.0.cloudera1所依赖的库) 我在build.gradle中
org.roaringbitmap:roaringbitmap:0.7.42
替换org.roaringbitmap:roaringbitmap:0.5.11
(org.apache.spark:spark-core_2.11:2.1.0.cloudera1和org.apache.spark:spark-sql_2.11:2.1.0.cloudera1
所依赖的库)
我在build.gradle
中的依赖项如下
dependencies {
compile 'org.apache.spark:spark-core_2.11:2.1.0.cloudera1'
runtime ('org.apache.spark:spark-core_2.11:2.1.0.cloudera1') {
exclude group: 'org.roaringbitmap'
}
compile 'org.apache.spark:spark-sql_2.11:2.1.0.cloudera1'
runtime ('org.apache.spark:spark-sql_2.11:2.1.0.cloudera1') {
exclude group: 'org.roaringbitmap'
}
compile 'org.roaringbitmap:RoaringBitmap:0.7.42'
implementation 'org.roaringbitmap:RoaringBitmap'
constraints {
implementation('org.roaringbitmap:RoaringBitmap:0.7.42') {
because 'because of transitive dependency'
}
}
}
gradle-q dependencyInsight--dependency org.roaringbitmap
的输出显示依赖关系已经更新
org.roaringbitmap:RoaringBitmap -> 0.7.42
variant "default+runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
\--- compileClasspath
org.roaringbitmap:RoaringBitmap:0.5.11 -> 0.7.42
variant "default+runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
\--- org.apache.spark:spark-core_2.11:2.1.0.cloudera1
+--- compileClasspath
+--- org.apache.spark:spark-sql_2.11:2.1.0.cloudera1
| \--- compileClasspath
\--- org.apache.spark:spark-catalyst_2.11:2.1.0.cloudera1
\--- org.apache.spark:spark-sql_2.11:2.1.0.cloudera1 (*)
不幸的是,当我使用spark2 submit
运行应用程序时,运行时依赖项的实际版本是org.roaringbitmap:roaringbitmap:0.5.11
如何强制我的应用程序使用所需版本的RoaringBitmap?我认为CDH提供的库优先于您的库 您可以使用spark2 shell中的下一段代码来检查这一点:
import java.lang.ClassLoader
val cl = ClassLoader.getSystemClassLoader
cl.asInstanceOf[java.net.URLClassLoader].getURLs.foreach(println)
通常我使用插件来克服它。我相信CDH提供的库比您的库更重要 您可以使用spark2 shell中的下一段代码来检查这一点:
import java.lang.ClassLoader
val cl = ClassLoader.getSystemClassLoader
cl.asInstanceOf[java.net.URLClassLoader].getURLs.foreach(println)
通常我使用插件来克服它。Spark可以选择将用户类路径优先于自己的路径
最有可能的情况是,您还应该查看阴影 Spark有一个选项,可以将用户类路径优先于自己的路径
最有可能的情况是,您还应该查看阴影 我无法回答具体问题,但您确定“强制”版本是正确的做法吗?只有当5.11和7.42是二进制兼容的,也就是说,每个可访问代码的类和方法名称、参数和声明的异常都是严格相同的时,它才会工作。如果Spark在5.11中调用RoaringBitmap的
A#whatever()
,并且该方法在7.42中已更改(或被删除),它将崩溃。你最好的选择是使用Spark的版本重新编写你的应用程序,或者使用。我无法回答具体问题,但你确定“强制”版本是正确的做法吗?只有当5.11和7.42是二进制兼容的,也就是说,每个可访问代码的类和方法名称、参数和声明的异常都是严格相同的时,它才会工作。如果Spark在5.11中调用RoaringBitmap的A#whatever()
,并且该方法在7.42中已更改(或被删除),它将崩溃。你最好的选择是使用Spark的版本重新编写你的应用程序,或者使用。