>我在虚拟机上的 docker 中有一个 Nifi 实例,暴露了端口:8080 和 10000。 在瘦实例上,我创建了一个带有名为"flink"的输出端口的简单管道,我想使用 flink-nifi 连接器读取此数据:
SiteToSiteClientConfig clientConfig = new SiteToSiteClient.Builder()
.url("http://vm-address:8080/nifi")
.portName("flink")
.requestBatchCount(100)
.buildConfig();
DataStream<NiFiDataPacket> nifi = environment.addSource(new NiFiSource(clientConfig));
nifi.map(new MapFunction<NiFiDataPacket, JsonNode>() {
@Override
public JsonNode map(NiFiDataPacket value) throws Exception {
return DataConverter.byte2Json(value.getContent());
}
}).print();
在这种情况下,我得到了错误:Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: java.net.UnknownHostException
如果我在配置中添加本地地址:
SiteToSiteClientConfig clientConfig = new SiteToSiteClient.Builder()
.url("http://vm-address:8080/nifi")
.localAddress(InetAddress.getByName("vm-address"))
.portName("flink")
.requestBatchCount(100)
.buildConfig();
我收到此错误:Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: java.net.BindException: Cannot assign requested address: JVM_Bind
我在 Windows 上从本地 pc 运行此代码,flink 以独立模式启动。 另外,我尝试直接在虚拟机上运行它,但遇到了同样的错误。
在日志中有很多重试:
执行链。RetryExec: I/O exception (java.net.BindException( 捕获 处理请求时/vm-address->{}->http://vm-address:8080:无法分配请求 地址: JVM_Bind
终于解决了! 问题出在我的码头工人配置中。首先,我像这样运行 nifi:docker run --name nifi -p 8008:8080 -p 10000:10000 -d apache/nifi:1.7.1
默认情况下,网络bridge
.在这种情况下,我的容器有一些随机主机名,我不直接与容器通信,而是通过 docker 通信。 当我选择网络=主机时:docker run --name nifi --network host -d apache/nifi:1.7.1
一切都很顺利。 也许,我可以用另一种方式解决它(也许,显式解析容器主机名(,但这是最简单的方法