Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 替换默认情况下导入的Spark'库;s类路径_Apache Spark_Gradle_Dependency Management - Fatal编程技术网

Apache spark 替换默认情况下导入的Spark'库;s类路径

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中

我目前正在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
中的依赖项如下

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的版本重新编写你的应用程序,或者使用。