Apache flink 如何为每个任务管理器(或每个节点)运行一个源?

Apache flink 如何为每个任务管理器(或每个节点)运行一个源?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我已经实现了开放固定UDP端口并监听它的源代码。因此,我希望每个任务管理器只运行一个源(在我的示例中,每个节点运行一个任务管理器),因为会抛出java.net.BindException:Address ready in use异常 我在测试ApacheFlink的HA时注意到了这个问题。当我关闭一个任务管理器时,Apache Flick开始尝试在一个节点上运行两个具有相同端口的源 那么,如何在每个任务管理器(或每个集群节点)上只运行一个源呢 当前不可能动态强制每个TaskManager上只运行

我已经实现了开放固定UDP端口并监听它的源代码。因此,我希望每个任务管理器只运行一个源(在我的示例中,每个节点运行一个任务管理器),因为会抛出
java.net.BindException:Address ready in use
异常

我在测试ApacheFlink的HA时注意到了这个问题。当我关闭一个任务管理器时,Apache Flick开始尝试在一个节点上运行两个具有相同端口的源


那么,如何在每个任务管理器(或每个集群节点)上只运行一个源呢

当前不可能动态强制每个
TaskManager
上只运行一个任务。通过将插槽数设置为
1
,可以避免将多个源任务调度到同一台机器上。但是,如果您丢失了一台机器,并且没有备用的
TaskManager
,那么您将没有足够的插槽来重新启动作业


或者,您可以编写源代码,使其更具弹性。例如,如果源无法绑定到指定的端口,则可以简单地停止源。如果没有其他程序可以绑定到该端口,那么您就知道已经有另一个源任务在使用来自该端口的数据。

您是否尝试过将并行度设置为节点数?如何动态执行(基于任务管理器或节点数)?来自文档:“通过在ExecutionEnvironment上调用setParallelism(int parallelism)或将-p传递给Flink命令行前端,可以覆盖整个作业的默认并行性。通过在运算符上调用setParallelism(int parallelism),可以覆盖单个转换。有关并行性的更多信息,请参阅编程指南。“当然,我知道。但是如何动态更改并行性(基于任务管理器或节点的数量)?我在第一个解决方案中看到一个问题:可以在任何任务管理器/节点上启动源,但我只能将数据发送到一个节点(活动/主节点)所以,第二种解决方案更有趣,但我有一个问题:1)你能解释一下“停止源代码”是什么意思吗"? 如何停止源代码?2) 据我所知,AF将尝试重新启动停止的源。对吗?所以,在这种情况下,AF将循环重启流。对吗?只需离开
run
功能即可。这将完成任务。所以你可以尝试打开一个套接字,如果失败了,那么你就离开
run
方法。它会阻止检查点的创建:“检查点触发任务源:RSyslog(2/2)目前未执行。正在中止检查点。“其中‘RSyslog(2/2)’源处于完成状态。这是当前Flink实现的一个缺点。将来,我们将增强CheckpointCoordinator,使其能够处理关闭/完成的操作符。