【Unbounded stream】无界流
有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
【Bounded stream】有界流
有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。
【Connector】连接器
flink与其它组件(如kafka、hive、hbase、JDBC、Cassandra、Elasticsearch、HDFS、RabbitMQ等)交互连接的适配器,包括源Source连接器和Sink连接器。通过连接器可以从其它组件获取数据源或者数据流经过flink流式处理后输出到这些组件。
【Source】数据源
flink数据流输入源,预定义的数据源包括读取文件、目录和套接字,以及从集合和迭代器接收数据。另外通过连接器还支持Apache Kafka、RabbitMQ、Apache NiFi等数据源。
另外用户还可以自定义实现Source。
【Sink】数据槽
数据槽用于将Flink处理后的数据流输出或转存到其他组件、通道或文件系统。Sink消费使用数据流并将其转发到文件、sockets、外部系统或打印它们。Flink提供了各种内置的输出格式,封装在数据流操作之后。
常用的数据槽有:kafka sink、hdfs sink、Elasticsearch sink、RabbitMQ sink、Apache Flume sink、Redis sink,以及内置的BucketingSink 、StreamingFileSink、SocketClientSink等。
另外用户还可以自定义实现sink。
【Transformation】转换
将转换应用于一个或多个数据流或数据集,并产生一个或多个输出数据流或数据集。转换可能会更改每个记录的数据流或数据集,但也可能仅更改其分区或执行聚合。虽然算子和函数是Flink API的“物理”部分,但转换只是API概念。具体来说,大多数(但不是全部)转换都是由某些算子实现的。
【Function】函数
函数由用户实现,并封装Flink程序的应用逻辑。大多数函数由相应的算子包装 。
【ProcessFunction】处理函数
ProcessFunction 是 Flink 所提供的最具表达力的接口。用于处理来自一个或两个输入流中的单个事件或分组到一个窗口的事件。它提供了对时间和状态的细粒度控制。开发者可以在其中任意地修改状态,也能够注册定时器用以在未来的某一时刻触发回调函数。因此,可以利用 ProcessFunction 实现许多有状态的事件驱动应用所需要的基于单个事件的复杂业务逻辑。
【Operator】算子
是指针对数据流执行操作以产生其他数据流的功能,一个算子代表某种操作,通常由函数执行。源和数据槽是用于数据摄取和数据输出的特殊算子。
【Operator Chain】算子链
一个算子链由两个或多个连续的算子组成,中间没有任何重新分配。同一算子链中的算子无需经过序列化或Flink的网络堆栈即可直接将记录彼此转发。
为了更高效地分布式执行,Flink会尽可能地将算子的子任务链接在一起形成task任务。每个task在一个线程中执行。将算子链接成task是非常有效的优化,它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量。
【Partition】分区
分区是整个数据流或数据集的独立子集。通过将每个记录分配给一个或多个分区,将数据流或数据集划分为多个分区。任务在运行时使用数据流或数据集的分区。改变数据流或数据集分区方式的转换通常称为重新分区。
【State Backend】状态后端
对于流处理程序,Flink作业的状态后端确定如何在每个TaskManager(TaskManager的Java堆或(嵌入式)RocksDB)上存储其状态,以及在检查点上写入状态的位置(Flink Master或文件系统的Java堆) 。
存储键/值索引的确切数据结构取决于所选的状态后端。一个状态后端将数据存储在内存哈希表中,另一个状态后端使用RocksDB作为键/值存储。除了定义保存状态的数据结构外,状态后端还实现了获取键/值状态的时间点快照并将该快照存储为检查点的一部分的逻辑。
Flink 提供了三种可用的状态后端:MemoryStateBackend、FsStateBackend和RocksDBStateBackend。
【Side Output】旁侧输出
旁侧输出可实现从Flink算子获得多个输出流,除了从 DataStream 操作结果获取主数据流之外,还可以产生任意数量额外的旁侧输出结果流。旁侧输出的数据类型不需要与主数据流的类型一致,不同旁侧输出的类型也可以不同。当你想要拆分数据流时(通常需要复制流),然后从每个流过滤出不需要的数据,此操作将非常有用。
除了错误报告(如异常、格式错误的事件、延迟事件、操作告警)之外,旁侧输出也是实现流的n路拆分的好方法。
【Checkpoint】检查点
检查点是应用程序状态和源流中位置的自动异步快照。在发生故障的情况下,启用了检查点的Flink程序将在恢复时从上一个完成的检查点恢复处理,确保Flink在应用程序中保持一次性(exactly-once)状态语义。检查点机制暴露应用程序代码的接口,以便将外部系统包括在检查点机制中(如打开和提交数据库系统的事务)。
【Savepoint】保存点
保存点是一种手动触发的检查点,用户可以生成保存点,停止正在运行的Flink程序,然后从流中的相同应用程序状态和位置恢复程序。 保存点可以在不丢失应用程序状态的情况下对Flink程序或Flink群集进行更新。
保存点是应用服务状态的一致性快照,与checkpoint相比,Savepoint 需要手动触发启动,而且当流应用服务停止时,它并不会自动删除。Savepoint 常被应用于启动一个已含有状态的流服务,并初始化其(备份时)状态。Savepoint 记录着流式应用中所有算子的状态。
Savepoint 包含了一个目录,其中包含(通常很大的)二进制文件,这些文件表示了整个流应用在 Checkpoint/Savepoint 时的状态。
Savepoint还包含一个(相对较小的)元数据文件,包含了指向 Savapoint 各个文件的指针,并存储在所选的分布式文件系统或数据存储中。
【Windows】窗口
聚合事件(例如,计数,总和)在流上的工作方式与批处理中的不同。例如,不可能计算流中的所有元素,因为流通常是无限的(无界)。相反,流上的聚合(计数,总和等)由窗口限定范围,例如“过去5分钟内的计数”或“最近100个元素的总和”。
窗口可以是时间驱动的(例如:每隔30秒)或数据驱动(例如:每隔100个元素)。窗口类型通常可以划分为滚动窗口(无重叠), 滑动窗口(有重叠)和会话窗口(以不活动间隙为标点)。
【Event Time】事件时间
事件时间是创建事件的时间,是每个事件在其生产设备上创建的时间(戳)。此时间通常在进入Flink之前嵌入记录中,并且可以从每个记录中提取该事件时间戳。
【Ingestion time】摄取时间
摄取时间是事件进入Flink数据流的时间。在源算子处,每个记录将源的当前时间作为时间戳,并且基于时间的算子操作(如时间窗口)引用该时间戳。
【Processing Time】处理时间
处理时间是执行基于时间的操作的每个算子的本地系统时间。
【watermarks】水印
用于解决基于事件时间处理时的数据乱序和数据迟到的问题。
WaterMark包含一个时间戳,Flink使用WaterMark标记所有Event Time小于该时间戳的消息都已流入,Flink的数据源在确认所有小于某个时间戳的消息都已输出到Flink流处理系统后,会生成一个包含该时间戳的WaterMark,插入到消息流中输出到Flink流处理系统中,Flink算子按照时间窗口缓存所有流入的消息,当算子处理到WaterMark时,它对所有小于该WaterMark时间戳的时间窗口数据进行处理并和WaterMark一起发送到下一个算子节点。
【Job】作业
Flink作业是Flink程序的运行时表示形式。Flink作业既可以提交到长期运行的Flink会话集群,也可以作为独立的Flink应用程序集群启动。
【Task】任务
任务是基本工作单元,由Flink的运行时执行,每个task由一个线程执行。任务恰好封装了一个算子或算子链的并行实例。
【Sub-Task】子任务
子任务是负责处理数据流分区的任务。子任务强调针对同一算子或算子链有多个并行任务。
【Job Manager】作业管理器
也叫master,协调和管理程序的分布式执行。它主要负责调度task任务,协调checkpoint检查点,协调故障恢复等。机器集群中至少要有一个master,高可用设置的话可以有多个master,但要保证一个是leader, 其他是standby; Job Manager包含Actor system、Scheduler、Check pointing三个重要的组件。
【Task Manager】任务管理器
也叫worker,TaskManager是Flink集群的工作进程。负责执行数据流的任务(或子任务),并缓冲和交换数据流。任务被分配给TaskManager执行。它们彼此通信以在后续任务之间交换数据。每个TaskManager是一个JVM进程,可以在独立的线程中执行一个或多个子任务。Task Manager从Job Manager处接收需要部署的Task。
【Task slot】任务槽
每个任务槽代表TaskManager资源的固定子集。例如,具有三个任务槽的TaskManager将把其1/3的托管内存专用于每个任务槽,即平均分配内存给任务槽。可以在任务槽中运行一个或多个线程。 同一插槽中的线程共享相同的 JVM。 同一JVM中的任务共享TCP连接和心跳消息。Task Manager的一个 Slot 代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对CPU隔离。默认情况下,Flink 允许子任务共享任务槽,即使它们是不同任务的子任务,只要它们来自相同的job。这种共享可以有更好的资源利用率。
【Parallel Dataflow】并行数据流
Flink中的程序本质上是并行和分布式的。在执行期间,一个流具有一个或多个流分区,每个算子有一个或多个算子子任务。算子子任务彼此独立,并在不同的线程中执行,并且可能在不同的机器或容器上执行。
算子子任务的数量是该特定操作员的并行度。流的并行度通常是其产生算子的并行度。同一程序的不同算子可能具有不同的并行度。
流可以按一对一(或转发)模式或重新分配模式在两个算子之间传输数据。
【DataSet API】
DataSet API 是 Flink 用于批处理应用程序的核心 API,支持Java和Scala语言。DataSet API 所提供的基础算子包括map、reduce、(outer) join、co-group、iterate等。所有算子都有相应的算法和数据结构支持,对内存中的序列化数据进行操作。如果数据大小超过预留内存,则过量数据将存储到磁盘。Flink 的 DataSet API 的数据处理算法借鉴了传统数据库算法的实现,例如混合散列连接(hybrid hash-join)和外部归并排序(external merge-sort)。
【DataStream API】
DataStream API 为许多通用的流处理操作提供了处理原语。这些操作包括窗口、逐条记录的转换操作,在处理事件时进行外部数据库查询等。DataStream API 支持 Java 和 Scala 语言,预先定义了例如map()、reduce()、aggregate() 等函数。你可以通过扩展实现预定义接口或使用 Java、Scala 的 lambda 表达式实现自定义的函数。
【SQL & Table API】
Flink 支持两种关系型的 API,Table API 和 SQL,支持Java和Scala语言,用于对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作。这两个 API 都是批处理和流处理统一的 API,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 API 会以相同的语义执行查询,并产生相同的结果。Table API 和 SQL 借助了 Apache Calcite 来进行查询的解析,校验以及优化。它们可以与 DataStream 和 DataSet API 无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。
Flink 的关系型 API 旨在简化数据分析、数据流水线和 ETL 应用的定义。
【Libraries】库
Flink 具有数个适用于常见数据处理应用场景的扩展库。这些库通常嵌入在 API 中,且并不完全独立于其它 API。它们也因此可以受益于 API 的所有特性,并与其他库集成。
【CEP】复杂事件处理
模式检测是事件流处理中的一个非常常见的用例。Flink 的 CEP 库提供了 API,使用户能够以例如正则表达式或状态机的方式指定事件模式。CEP 库与 Flink 的 DataStream API 集成,以便在 DataStream 上评估模式。CEP 库的应用包括网络入侵检测,业务流程监控和欺诈检测。
【Gelly】
Flink的图计算库,提供了图计算的相关API及多种图计算算法实现。Gelly是一个可扩展的图形处理和分析库。Gelly是在DataSet API 之上实现的,并与DataSet API集成。因此它能够受益于其可扩展且健壮的操作符。Gelly提供了内置算法,如label propagation、triangle enumeration和page rank算法,也提供了一个简化自定义图算法实现的Graph API。
【Flink ML】
Flink机器学习库,提供了机器学习Pipelines API并实现了多种机器学习算法。
【Flink Web UI】
Flink提供了一个web UI来观察、监视和调试正在运行的应用服务。并且还可以执行或取消组件或任务的执行。