elasticsearch-5,xpack,Netty,Apache Flink,elasticsearch 5,Xpack" /> elasticsearch-5,xpack,Netty,Apache Flink,elasticsearch 5,Xpack" />

Flink与ElasticSearch 5 io.netty库的水槽冲突

Flink与ElasticSearch 5 io.netty库的水槽冲突,netty,apache-flink,elasticsearch-5,xpack,Netty,Apache Flink,elasticsearch 5,Xpack,我正在玩flink+ElasticSearch 5接收器,使用x-pack身份验证 我首先犯了这个错误 所以我修复了覆盖ES Sink函数的问题 我现在的问题是,当我尝试在flink上运行作业(使用jar)时,我遇到了这个错误 Caused by: java.lang.NoSuchMethodError: io.netty.buffer.CompositeByteBuf.addComponents(ZLjava/lang/Iterable;)Lio/netty/buffer/Composite

我正在玩flink+ElasticSearch 5接收器,使用x-pack身份验证

我首先犯了这个错误

所以我修复了覆盖ES Sink函数的问题

我现在的问题是,当我尝试在flink上运行作业(使用jar)时,我遇到了这个错误

Caused by: java.lang.NoSuchMethodError: io.netty.buffer.CompositeByteBuf.addComponents(ZLjava/lang/Iterable;)Lio/netty/buffer/CompositeByteBuf;
    at org.elasticsearch.transport.netty4.Netty4Utils.toByteBuf(Netty4Utils.java:78)
    at org.elasticsearch.transport.netty4.Netty4Transport.sendMessage(Netty4Transport.java:422)
    at org.elasticsearch.transport.netty4.Netty4Transport.sendMessage(Netty4Transport.java:93)
    at org.elasticsearch.transport.TcpTransport.internalSendMessage(TcpTransport.java:1058)
    at org.elasticsearch.transport.TcpTransport.sendRequestToChannel(TcpTransport.java:1040)
    at org.elasticsearch.transport.TcpTransport.executeHandshake(TcpTransport.java:1555)
    at org.elasticsearch.transport.TcpTransport.openConnection(TcpTransport.java:502)
    at org.elasticsearch.transport.TcpTransport.connectToNode(TcpTransport.java:460)
    at org.elasticsearch.transport.TransportService.connectToNode(TransportService.java:318)
    at org.elasticsearch.client.transport.TransportClientNodesService$SimpleNodeSampler.doSample(TransportClientNodesService.java:408)
    at org.elasticsearch.client.transport.TransportClientNodesService$NodeSampler.sample(TransportClientNodesService.java:354)
    at org.elasticsearch.client.transport.TransportClientNodesService.addTransportAddresses(TransportClientNodesService.java:195)
    at org.elasticsearch.client.transport.TransportClient.addTransportAddress(TransportClient.java:312)
    at com.ceptinel.flink.sink.Elasticsearch5ApiCallBridge.createClient(Elasticsearch5ApiCallBridge.java:45)
    at org.apache.flink.streaming.connectors.elasticsearch.ElasticsearchSinkBase.open(ElasticsearchSinkBase.java:272)
    at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36)
    at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.open(AbstractUdfStreamOperator.java:112)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.openAllOperators(StreamTask.java:375)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:251)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:670)
    at java.lang.Thread.run(Thread.java:745)
flink和ES客户端之间的库io.netty似乎存在冲突(不确定是x-pack-transport还是连接器本身)

有什么办法可以避免这种冲突吗

谢谢
Luis

在Apache Flink中修复这一问题之前(通过去除netty依赖项),我建议您将用户jar中的netty隐藏到不同的名称空间中

如果您正在使用ApacheMaven构建项目,那么可以使用
Maven shade插件

还可以查看关于Flink中着色的文档页面:

在Apache Flink中修复此问题之前(通过将netty依赖项着色掉),我建议您将用户jar中的netty着色到不同的命名空间中

如果您正在使用ApacheMaven构建项目,那么可以使用
Maven shade插件

还可以查看关于Flink中着色的文档页面:

我使用gradle而不是maven,但过程大致相同

在这种情况下,如果你仍然有这个问题(这是非常不可能的),我已经尝试解决,解决方案似乎工作

这是我的依赖项块:

dependencies {
    ....
    compile(group: 'org.apache.flink', name: 'flink-streaming-java_2.10', version: project.flinkStreamJavaVersion)
            {
                exclude group: 'io.netty'
            }
    compile group: 'org.apache.flink', name: 'flink-connector-kafka-0.10_2.10', version: project.flinkKafkaConnectorVersion
    compile group: 'org.apache.flink', name: 'flink-connector-elasticsearch5_2.10', version: project.flinkElasticConnectorVersion

    ....
}
然后使用以下方法将io.netty着色到不同的包中:

shadowJar {
    ....
    relocate 'io.netty', 'shaded.io.netty'
    ....
}
注意:捕获是为了排除来自

flink-streaming-java_2.10

如果你试图在不排除来自flink streaming的荨麻的情况下遮荫,它不会改变任何事情。因此,排除来自flink流媒体库的netty是非常重要的。

我使用gradle而不是maven,但过程大致相同

在这种情况下,如果你仍然有这个问题(这是非常不可能的),我已经尝试解决,解决方案似乎工作

这是我的依赖项块:

dependencies {
    ....
    compile(group: 'org.apache.flink', name: 'flink-streaming-java_2.10', version: project.flinkStreamJavaVersion)
            {
                exclude group: 'io.netty'
            }
    compile group: 'org.apache.flink', name: 'flink-connector-kafka-0.10_2.10', version: project.flinkKafkaConnectorVersion
    compile group: 'org.apache.flink', name: 'flink-connector-elasticsearch5_2.10', version: project.flinkElasticConnectorVersion

    ....
}
然后使用以下方法将io.netty着色到不同的包中:

shadowJar {
    ....
    relocate 'io.netty', 'shaded.io.netty'
    ....
}
注意:捕获是为了排除来自

flink-streaming-java_2.10

如果你试图在不排除来自flink streaming的荨麻的情况下遮荫,它不会改变任何事情。因此,排除flink streaming lib中的netty非常重要。

感谢您的回复,是的,这是我试图做到的,我想我没有正确地进行着色。我会检查它。请随意将你的着色内容发布到某个地方(新的SO问题),然后如果你愿意,我可以查看它。我正在尝试做一些类似的事情:io.netty org.elasticsearch.client.dependencies.io.netty这几乎是正确的。您是否也将netty包括在
中?更新:在Flink 1.4中,netty将被着色掉。感谢您的回复,是的,这是我试图做的,我想我没有正确地进行着色。我会检查它。请随意将你的着色内容发布到某个地方(新的SO问题),然后如果你愿意,我可以查看它。我正在尝试做一些类似的事情:io.netty org.elasticsearch.client.dependencies.io.netty这几乎是正确的。您是否也将netty包含在
中?更新:在Flink 1.4中,netty将被着色掉。