Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 如何解决由于使用同一个库和使用gradle或其他任何工具的两个不同版本而产生的NoMethodError?_Apache Spark_Gradle - Fatal编程技术网

Apache spark 如何解决由于使用同一个库和使用gradle或其他任何工具的两个不同版本而产生的NoMethodError?

Apache spark 如何解决由于使用同一个库和使用gradle或其他任何工具的两个不同版本而产生的NoMethodError?,apache-spark,gradle,Apache Spark,Gradle,我有两个依赖项,它们使用同一个库,但版本不同,我得到了NoMethodError。我不知道如何使用gradle或其他方法解决它?任何帮助都会很好 group 'com.hello' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'idea' repositories { mavenCentral() mavenLocal() } dependencies { compile 'org.slf4j

我有两个依赖项,它们使用同一个库,但版本不同,我得到了NoMethodError。我不知道如何使用gradle或其他方法解决它?任何帮助都会很好

group 'com.hello'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'idea'

repositories {
    mavenCentral()
    mavenLocal()
}


dependencies {
    compile 'org.slf4j:slf4j-log4j12:1.7.12'
    compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.0.1'
    compile group: 'org.apache.spark', name: 'spark-streaming_2.11', version: '2.0.1'
    compile group: 'org.apache.spark', name: 'spark-streaming-kafka-0-10_2.11', version: '2.0.1'
    compile group:'org.apache.kafka', name: 'kafka-clients', version: '0.10.1.0'
    compile group: 'com.datastax.spark', name: 'spark-cassandra-connector_2.11', version: '2.0.0-M3'
    compile group: 'com.github.brainlag', name: 'nsq-client', version: '1.0.0.RC2'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
}


task buildStreamingJar(type: Jar) {
    if(project.hasProperty("jarname")) {
        def fullyQualifiedPackageName = ""
        def jarname = project.getProperty("jarname")
        if (jarname.equalsIgnoreCase("SparkDriver1")) {
            fullyQualifiedPackageName = "com.hello.streamprocessing.app.SparkDriver1"
        }
        if (jarname.equalsIgnoreCase("SparkDriver2")) {
            fullyQualifiedPackageName = "com.hello.streamprocessing.app.SparkDriver2"
        }

        baseName = project.name + "-$jarname" + "-stream"
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        with jar
        zip64 true
        from sourceSets.test.output
        manifest {
            attributes 'Main-Class': fullyQualifiedPackageName
        }
        exclude 'META-INF/.RSA', 'META-INF/.SF', 'META-INF/*.DSA'
    }
}
这里发生的事情是spark-core_2.11在我的依赖项中使用的 com.google.guava:14.0.1,nsq客户端使用com.google.guava:19.0

这将导致以下错误

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()Ljava/util/Set;
    at com.github.brainlag.nsq.NSQProducer.(NSQProducer.java:22)
    at com.hello.streamprocessing.app.SparkDriver2.main(SparkDriver2.java:37)

我需要使用这个build.gradle文件来构建一个胖的Uber罐子,这样我就可以将它与spark submit一起使用了。基本上,如果
spark core
nsq client
使用的是
guava
的特性,或者在一个版本或另一个版本中不存在,你就无法真正解决这个问题。您可以运行
gradlew dependencies
,它将向您展示gradle如何解决
guava
上的版本冲突。默认情况下,它将选择版本19.0作为较新的版本。您最好使用依赖于相同版本的
guava
的库版本。这是降级
nsq客户端
或升级
spark core
,如果可能的话

您可以像这样排除对
guava
的可传递依赖性:

dependencies {
...
  compile (group: 'com.github.brainlag', name: 'nsq-client', version: '1.0.0.RC2') {
    exclude group: 'com.google.guava', module: 'guava'
  }
...
}
但是,只有当nsq客户端不依赖上文提到的仅在guava版本
19.0
中提供的功能时,这才有效

遗憾的是,这是一个常见的问题,尤其是
guava
库,因为它几乎在每个项目中都使用,而且开发人员并不太关心库的稳定API

您的最佳选择可能是尝试将
番石榴
spark core
中排除,并尝试一次,如果它不起作用,则将其从
nsq客户端
中排除,并尝试一次。但,即使它乍一看似乎是有效的,也有可能是好的(或者在您的情况下实际上是坏的),您将在应用程序的运行时遇到类似的问题


如果上述方法不起作用,您仍然可以使用
nsq客户机
,并使用与
guava
14.0.1兼容的工具替换有问题的部分。我真的不喜欢这个选项,但是如果
nsq客户端的开发人员很好,他们可能会接受您的更改…

其中一个依赖项库没有被下载。使用两者的最新库。使用也可以使用这个:

repositories {
    mavenCentral()
}
configurations {
    compile
}
dependencies {
    compile 'dependency repo1'
    compile 'dependency repo2'
}
task libs(type: Sync) {
    from configurations.compile
    into "$buildDir/libs"
}

这将有助于下载这两个依赖项。

回答得很好!是的,因为我得到了newMethodError,很明显,它使用的是19.0中的功能,而不是14.0.1中的功能。你可以看到这是它所说的noMethodError@user1870400“回答得好!”讽刺?哦,天哪!我是一个积极的人。这确实是一个很好的答案,因为您的阐述非常好。我在SPARK_HOME/jars中用guava-19.0.jar替换了guava-14.0.1.jar,这似乎很好,但我不确定这样做是否正确。我担心的是,如果Spark使用的是Guava的功能,这些功能只出现在14.0.1中,而没有出现在19.0中,我想我的应用程序会崩溃。