Flink与ElasticSearch 5 sink冲突的io.netty库

时间:2017-03-22 21:22:35

标签: netty apache-flink elasticsearch-5 xpack

我正在玩flink + ElasticSearch 5 Sink,使用x-pack身份验证。

我先得到这个错误 Flink Xpack ElasticSearch 5 ElasticsearchSecurityException missing autentication

所以我修复了它覆盖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还是连接器本身)

避免这种冲突的任何解决方法?

由于 路易斯

2 个答案:

答案 0 :(得分:1)

在Apache Flink中修复此问题之前(通过隐藏netty依赖关系),我建议您将用户jar中的netty隐藏到不同的命名空间中。

如果您使用Apache Maven构建项目,则可以使用... // override PATH and SYSROOT to android NDK (standalone toolchain) export CFLAGS="-I$SRC/libftdi1.0-2-android-arm-lollipop/include -I$SRC/libusb1.0-2-android-arm-lollipop/include -fPIE" export CPPLAGS="$CPPFLAGS -fPIE" export CXXLAGS="$CXXFLAGS -fPIE" export LDFLAGS="$LDFLAGS -lusb-1.0 -lusb -lftdi -L$SRC/libftdi1.0-2-android-arm-lollipop/lib -L$SRC/libusb1.0-2-android-arm-lollipop/lib -L$SRC/libusb-android-arm-lollipop/lib -static -fPIE -pie" ../configure --build=x86-unknown-linux-gnu --host=arm-linux-androideabi --target=arm-linux-androideabi --verbose 来执行此操作。 另请查看Flink中着色的文档页面:https://ci.apache.org/projects/flink/flink-docs-release-1.3/monitoring/debugging_classloading.html#resolving-dependency-conflicts-with-flink-using-the-maven-shade-plugin

答案 1 :(得分:1)

我使用的是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'
    ....
}

注意:捕获的是排除来自

的netty
flink-streaming-java_2.10

如果你试图遮挡而不排除来自flink-streaming的netty,它将不会改变任何东西。因此,排除来自flink-streaming lib的netty非常重要。