几天来,我一直在探索Apache Flink,我对任务槽的概念有些怀疑。虽然有人问了几个问题,但有一点我不明白。
我正在使用一个toy应用程序进行测试,运行一个本地集群。我已禁用操作员链接
我从文档中知道插槽允许内存隔离而不是CPU隔离。阅读文档,任务槽似乎是一个Java线程。
1)当我以并行度=1部署我的应用程序时,所有运算符的子任务都部署在同一个插槽中。但是,如果我从AbstractStreamOP
的open()
方法打印当前线程ID,我会看到不同子任务的不同ID。那么,它们不是共享同一个线程吗(即插槽?)。
2)如果我将并行度从1更改为3,我需要3个插槽才能正确重新部署应用程序。文档确认插槽的数量限制了我可以拥有的并行度。但是为什么我可以在同一个插槽中拥有不同运算符的子任务,而我不能在同一个插槽中拥有相同运算符的子任务?
谢谢你的解释!
插槽的思想是将可用资源分割成更小的部分。可用的托管内存均匀分布在所有插槽中。CPU周期和JVM堆内存不是正确隔离的wrt插槽。
在每个插槽中,您可以部署一个或多个任务。Flink任务由专用线程执行。因此,如果部署了多个任务,那么可以在同一个插槽中运行多个线程。
任务表示单个Flink操作符或多个操作符(如果可以链接)的并行实例。链接并不总是可能的,也不总是需要的,但如果应用,它将融合操作符,以便它们由相同的任务线程执行。这通常效率更高,因为上下文切换更少,并且没有将记录移交给其他线程。
为了提高资源利用率(特别是对于需要很少资源的任务
)并使有关运行Flink程序需要多少插槽的推理更容易,Flink支持插槽共享。插槽共享意味着可以将不同运营商的并行实例部署到同一个插槽。由于这个特性,Flink创建了尽可能长的不同运营商的管道,并将它们部署到同一个插槽。这也有一个很好的效果,即您增加了生产者与各自消费者的共定位。由于这个特性,用户知道他们只需要提供与one拓扑的所有运营商的最大并行度一样多的插槽。
但是,由于您仍然希望在所有可用的TaskExecutors中分布操作符的并行实例,Flink不支持将同一操作符的并行实例部署到同一插槽。如果要这样做,那么只需将相应操作符的并行度降低到1即可。
在Flink中,像“平面地图”、“地图”等运算符称为任务,如果我将平面地图的并行度设置为30,那么这个任务有30个子任务。 现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程? Flink会在该插槽中简单地创建30个线程,还是使用类似线程池的东西? 以上不是一个恰当的例子。 假设在作业中我有操作符flatMap和map,它们都有并行度1,我只有一个插槽,这个插槽会创
我是Flink的新手。据我了解,在Flink中,一个TaskManager可以分成多个插槽,一个插槽可以分配多个任务,一个任务是一个线程。 让我们看看WordCount示例: 据我所知,一个任务就是一个线程,有三个任务:<代码>源映射() ,<代码>keyBy()/窗口()/应用() 和<代码>接收器 。所以每个都有自己的线程,这意味着我们需要三个线程来完成这个示例。我们可以将三个任务(三个线程)
今天早上,我发现了我的GitHub Actions BETA版邀请,并开始玩它,目的是迁移一些我目前在CircleCi上运行的简单构建、测试和部署管道。 我仍然在试图理解操作,但我心目中的流程是,在推动之后,工作流中的第一个操作将启动一个Docker容器。在这个容器中,我将运行一些简单的构建过程,比如最小化资产和移除人工制品。接下来的操作将在构建上运行一些测试。管道中的下一个操作将部署到许多环境中
我的问题是,如果我们有两个原始事件流,即烟雾和温度,并且我们想通过将运算符应用于原始流来找出复杂事件(即火灾)是否发生,我们可以在Flink中做到这一点吗? 我问这个问题是因为到目前为止,我所看到的Flink CEP的所有示例都只包括一个输入流。如果我错了,请纠正我。
因此,在重构我的基于类的聊天机器人组件以使用反应钩子的过程中,我遇到了一个使用状态钩子覆盖状态中的对象的问题。这导致只有机器人响应显示在用户界面中。当我与机器人聊天时,用户界面中显示的用户输入的闪光会被聊天机器人的响应覆盖。下面是代码: 可以这样在同一个异步函数中写入useState两次吗?如果不是,您建议我如何重构此代码,以便消息状态返回一个交替对象数组,例如: