Flink与ElasticSearch 5 io.netty库的水槽冲突
我正在玩flink+ElasticSearch 5接收器,使用x-pack身份验证 我首先犯了这个错误 所以我修复了覆盖ES Sink函数的问题 我现在的问题是,当我尝试在flink上运行作业(使用jar)时,我遇到了这个错误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
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将被着色掉。