一状态介绍什么叫状态中间计算结果。Flink 算子分为无状态和有状态两种无状态算子仅根据当前独立事件处理直接输出结果不保存中间数据。示例map、filter、flatMap。特点不存储任何状态无状态。有状态算子除了当前数据还需读取 / 更新中间状态state才能计算输出结果聚合、窗口、多输入算子均属于有状态算子。有状态算子处理流程接收上游数据获取当前状态按业务逻辑计算并更新状态输出结果至下游二状态的分类1托管状态和原始状态Flink的状态有两种托管状态Managed State和原始状态Raw State。托管状态就是由Flink统一管理的状态的存储访问、故障恢复和重组等一系列问题都由Flink实现我们只要调接口就可以我们重点研究这个将来项目中咱们基本上都是托管状态而原始状态则是自定义的相当于就是开辟了一块内存需要我们自己管理实现状态的序列化和故障恢复。通常我们采用Flink托管状态来实现需求。2算子状态和按键分区状态接下来我们的重点就是托管状态我们知道在Flink中一个算子任务会按照并行度分为多个并行子任务执行而不同的子任务会占据不同的任务槽task slot。由于不同的slot在计算资源上是物理隔离的所以Flink能管理的状态在并行任务间是无法共享的每个状态只能针对当前子任务的实例有效。每一个并行度子任务有自己的托管状态都有自己的状态。而很多有状态的操作比如聚合、窗口都是要先做keyBy进行按键分区的。按键分区之后任务所进行的所有计算都应该只针对当前key有效所以状态也应该按照key彼此隔离。在这种情况下状态的访问方式又会有所不同。基于这样的想法我们又可以将托管状态分为两类算子状态和按键分区状态。算子状态给每一个算子的并行子任务准备的按键分区状态键控状态给子任务当中的key准备的。经过keyby之后。注意组合组之间状态是隔离的子任务和子任务之间状态是隔离的不给共用。可以通过富函数RichFunction自定义 Keyed State即使 map、filter 等无状态基础算子也能通过富函数接口添加 Keyed State如 RichMapFunction、RichFilterFunction。富函数中可通过getRuntimeContext()获取运行时上下文进而定义状态所有算子本质都可拥有状态。无论 Keyed State 还是 Operator State都由本地并行子任务维护并行子任务之间不共享状态。