java.lang.NoSuchMethodError:com.google.common.collect.Sets $ SetView.iterator()Lcom / google / common / collect / UnmodifiableIterator;

时间:2017-09-03 19:27:28

标签: elasticsearch apache-kafka apache-kafka-connect confluent

我一直在尝试使用kafka-connect api将kafka连接到elasticsearch.Kafka版本是0.11.0.0。这是我遵循的步骤:

1.Buiding Elasticsearch Connector:

https://github.com/confluentinc/kafka-connect-elasticsearch.git

2.建立连接器

import numpy as np
print(np.array2string(np.outer(np.arange(1, mystery_int+1), 
                               np.arange(1, mystery_int+1)), 
                      separator='\t'))

3.最后运行脚本:

$ cd kafka-connect-elasticsearch
$ mvn clean package

抛出以下异常:

$ bin/connect-standalone.sh config/connect-standalone.properties config/elasticsearch-connect.properties

无法理解出了什么问题。

4 个答案:

答案 0 :(得分:5)

根据经验,此错误意味着您在类路径中提前使用较早版本的guava。 Connect worker需要guava >= 20 org.reflections才能正常工作。

kafka-connect-elasticsearch或带有guava 18.0或更早版本的任何其他连接器将禁止工作人员启动。此错误消息表示在类路径中首先遇到较旧的guava jar。

两种解决方案:

  1. 确实,正如Hans Jespersen提到的那样,通过在Connect worker的配置中设置plugin.path来使用类加载隔离,将允许连接器按原样运行 而不会干扰Connect框架。
  2. 如果将连接符添加到CLASSPATH是唯一的选项,请确保在Kafka Connect的依赖项之后添加它,以便最新的guava被选中。

答案 1 :(得分:2)

这似乎描述了您的问题的答案https://github.com/confluentinc/kafka-connect-elasticsearch/issues/104

  

这有点令人困惑,但在你构建连接器之后有一个   目标目录中的数量。该   kafka-connect-elasticsearch-.jar只是带有的JAR文件   连接器代码,但不包括所有库。之一   目标目录中的那些目录,即   目标/卡夫卡连接-elasticsearch - * - 开发/股/ JAVA /卡夫卡连接-elasticsearch /,   确实包含所有库。将此目录添加到Kafka   连接worker的类路径,或将所有这些JAR文件复制到一个   已存在于类路径中的目录。

答案 2 :(得分:0)

对于将来的读者,我遇到类似的问题,没有使用kafka。我花了很多时间试图找出问题所在,最后,我有了一个模式。

在我的项目中,我使用了ro.isdc.wro4j:wro4j-extensions:1.8.0org.reflections:reflections:0.9.11

<dependency>
    <groupId>ro.isdc.wro4j</groupId>
    <artifactId>wro4j-extensions</artifactId>
    <version>1.8.0</version>
</dependency>
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

发生冲突的原因是ro.isdc.wro4j:wro4j-extensions:1.8.0使用了com.google.javascript:closure-compiler:jar:v20160315,我通过将com.google.javascript:closure-compiler:jar:v20160315从pom中排除来解决了这个问题。

<dependency>
    <groupId>ro.isdc.wro4j</groupId>
    <artifactId>wro4j-extensions</artifactId>
    <version>1.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.javascript</groupId>
            <artifactId>closure-compiler</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>

但是,问题是依赖于构建的,我们不知道哪个jar可能导致冲突。在这种情况下,您需要通过运行以下内容来了解​​jar的位置:

CodeSource source = com.google.common.collect.Sets.class.getProtectionDomain().getCodeSource();
if(source != null)
    logger.warn(source.getLocation().toString());

,看看输出是什么。就我而言,输出为

file:/tmp/jetty-0.0.0.0-8087-ROOT.war-_-any-1541284168668078443.dir/webapp/WEB-INF/lib/closure-compiler-v20160315.jar

希望,答案将帮助您找到解决问题的方法,

Mughrabi

答案 3 :(得分:0)

最近(2020年1月),我在本地主机(macOS Catalina)上遇到了此错误,并且能够通过更新.zprofile文件(zsh shell)来解决此错误。如果您有bash shell,则可以更改.bash_profile.bashrc文件。

•引起错误是因为我的jvm.classpath包含guava版本的依赖项<20。我的.zprofile文件已导出到hadoop-3.1.1apache-hive-3.1.1,这是问题所在错误。

•我正在使用kafka_2.12-2.0.0。因此,我只是在hadoop-3.1.1中评论了apache-hive-3.1.1.zprofile,并成功运行了我的twitter kafka连接器。

•通过遵循@Konstantine Karantasis在thread中的注释,我能够跟踪此错误。

希望这会有所帮助。