大佬们,请教一个问题,flink版本是1.15.1 ha部署,算子设置了多并发 ,如何确保每一个并发都运行在同一台机器上,现在的效果是这样的,会有某一个并发运行到了另一台机器上,这种情况在1.11的时候还没有?
全局有序通常难以保证,因为Flink的设计是为了实现高吞吐量和容错性,并不保证所有数据流全局有序。但在某些特定场景下,例如基于时间窗口的时间排序,可以通过设置时间驱动的窗口来达到一定程度上的全局有序。
要在Apache Flinck集群里确保每个算子的多个并发都在同一台物理机上运行,你需要做以下几个步骤:
Step 1 - 确保启用TaskManager内存限制功能
在启动 TaskManager 的时候加入 -Dtaskmanager.memory.process.size= 参数,其中 表示 TaskManager 可用的最大内存量。
Step 2 - 分配足够的内存给每个并发
根据你的需求,合理分配每个并发所需的内存大小。一般来说,每个并发都需要一定的内存空间来存储中间结果或缓冲区等临时数据。所以可以根据每个并发的实际工作量来确定它的内存需求。
Step 3 - 利用约束调度算法
在 Flink 1.15.x 版本之后引入了新的调度算法——“约束调度”(Constraint-based Scheduling)。这个新特性使得用户能够在不影响整体性能的情况下更好地控制任务分布情况。通过设置一些约束条件,可以让某些任务尽可能地被安排在一个节点上运行。
Step 4 - 修改默认的调度策略
如果你想让每个并发都能尽量跑在一起,可以修改默认的调度策略。在 conf/flink-conf.yaml 文件里面增加以下内容:
jobmanager.scheduler.name:"org.apache.flink.runtime.jobmanager.scheduler.ConstraintBasedScheduler"
同时,你还可以自定义一些约束规则,例如:
constraint.assignmentConstraints:
- constraintName: "affinity_constraint"
targetNodes:
- hostPortPair: ("localhost", <port>)
numConcurrentTasksPerNodeMax: 1
这段配置表示将相同主机上的并发任务数量限制为最多一个。注意,这些约束规则需要根据你的实际网络拓扑结构和硬件能力来制定。
遵循以上四个步骤,理论上可以使每个并发尽可能地运行在同一台物理机上。 不过,即使如此也不能完全避免出现跨物理机的现象。因为在高负载情况下,有时候不得不把一部分任务分散开来,以免造成某一节点过载。所以在设计之初就要考虑到这一点,预留足够大的容量应对突发流量高峰等情况。
根据你的描述,看起来你想让每个并行任务实例只在一个节点上运行,而不是跨多个节点分配。这是合理的,因为如果所有任务都在同一节点上运行,则可以减少网络延迟和提高性能。
要在Flink HA集群中做到这一点,首先检查一下是否启用了HA模式。如果是的话,尝试禁用HA模式,看看是否会按照预期的方式分布任务。如果不是,那就继续下面的操作。
我们需要修改作业的资源配置方式。默认情况下,Flink会在可用资源最少的任务间均衡分配任务。但是,当启用HA模式后,Flink会选择最安全的方式来平衡各个节点的工作量,这就可能导致某个任务跑到另一个节点上去。
你可以采用以下步骤来限制任务只能在其初始所在的节点上运行:
Step 1: 在YAML配置文件中找到taskmanager.numberOfTaskSlots
部分,将其改为所需的数值。例如,如果你只有一个节点上有两个CPU核心,那么可以设为2;如果有四个核则设为4等等。
Step 2: 找到taskmanager.memory.size
部分,为其设定足够的内存大小。这取决于你的硬件规格及所使用的容器镜像大小等因素。一般来说,至少要比你的应用程序所需要的堆栈空间大一点。
Step 3: 修改state.backend.type
为rocksdb
或者其他持久化的状态管理器(如HDFS)。这样,一旦发生故障切换,之前的状态信息仍然能够得到保护。
Step 4: 最后一步是启动Flink JobManager进程,让它监听所有的Worker Node。这通常是通过start-job-manager.sh
脚本来完成的。确保Job Manager正确接收到来自Worker Node的消息,并能正常响应。
以上操作完成后,再次重启Flink JobManager服务看是否有任何变化。如果没有看到期望的结果,那就要进一步排查日志,找出原因并做相应的调试。
在Flink 1.15.1中,为了确保每个并发都运行在同一台机器上,可以通过以下方式进行设置:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。