我正在玩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还是连接器本身)
避免这种冲突的任何解决方法?
由于 路易斯
答案 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'
....
}
注意:捕获的是排除来自
的nettyflink-streaming-java_2.10
如果你试图遮挡而不排除来自flink-streaming的netty,它将不会改变任何东西。因此,排除来自flink-streaming lib的netty非常重要。