Apache Flink官方文档中文版--Flink是什么?
架构原文链接
Apache Flink是一个用于对无边界和有边界数据流进行有状态计算的框架和分布式处理引擎。Flink设计为运行在所有常见的集群环境中,并且以内存速度和任意规模执行计算。
在这里,我们解释Flink架构的相关重要内容。
处理无边界和有边界数据
任何类型的数据都是作为事件流产生的。信用卡交易事务,传感器测量,机器日志以及网站或移动应用程序上的用户交互行为,所有这些数据都生成流。
数据可以作为无边界或有边界流处理。
[*]无边界流定义了开始但没有定义结束。它们不会在生成时终止提供数据。必须持续地处理无边界流,即必须在拉取到事件后立即处理它。无法等待所有输入数据到达后处理,因为输入是无边界的,并且在任何时间点都不会完成。处理无边界数据通常要求以特定顺序(例如事件发生的顺序)拉取事件,以便能够推断结果完整性。
[*]有边界流定义了开始和结束。可以在执行任何计算之前通过拉取到所有数据后处理有界流。处理有界流不需要有序拉取,因为可以随时对有界数据集进行排序。有边界流的处理也称为批处理。
Apache Flink擅长处理无边界和有边界数据集。在事件和状态上的精确控制使得Flink运行时能在无边界流上运行任意类型的应用程序。有界流由算法和数据结构内部处理,这些算法和数据结构专门针对固定大小的数据集而设计,从而获得优秀的性能。
随处部署应用程序
Apache Flink是一个分布式系统,需要计算资源才能执行应用程序。Flink与所有常见的集群资源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成,但也可以作为独立集群运行。
Flink旨在很好地适用于之前列出的每个资源管理器。这是通过特定于资源管理器的部署模式实现的,这些模式允许Flink以其惯用的方式与每个资源管理器进行交互。
部署Flink应用程序时,Flink会根据应用程序配置的并行度自动识别所需资源,并从资源管理器请求它们。如果发生故障,Flink会通过请求新的资源来替换发生故障的容器。提交或控制应用程序的所有通信都通过REST调用进行。这简化了Flink在许多环境中的集成。
任意规模运行应用程序
Flink旨在以任意规模运行有状态流式应用程序。应用程序可以并行化为数千个在集群中分布和同时执行的任务。因此,应用程序可以利用几乎无限量的CPU,内存,磁盘和网络IO。而且,Flink可以轻松维护非常大的应用程序的状态。其异步和增量检查点算法确保对延迟处理的影响最小,同时保证精确一次的状态一致性。
用户报告了在其生产环境中运行的Flink应用程序的扩展数字令人印象十分深刻,例如:
[*]应用程序每天处理数万亿个事件
[*]应用程序维护数个TB的状态
[*]应用程序在数千个CPU核上运行
利用内存的性能
有状态的Flink应用程序针对本地状态访问进行了优化。任务状态始终驻留在内存中,或者,如果状态大小超过可用内存,则保存在访问高效的磁盘上的数据结构中。因此,任务通过访问本地(通常是内存中)状态来执行所有计算,从而产生非常低的处理延迟。Flink通过定期和异步检查点将本地状态到持久存储来保证在出现故障时的精确一次的状态一致性。
应用
原文链接
Apache Flink是一个用于对无边界和有边界数据流进行有状态计算的框架。Flink在不同的抽象级别提供多个API,并为常见用例提供专用库。
在这里,我们介绍Flink易于使用以及富有表现力的API和库。
为流应用程序构建块
流式计算框架构建和运行的应用程序的类型,由框架控制流、状态以及时间的程度来定义。在下文中,我们描述了流处理应用程序的这些构建块,并解释了Flink处理他们的方法。
流
显然,流是流式处理的一个基本方面。然而,流可以有不同的特征,这些特征会影响流的处理方式。Flink是一个多功能的处理框架,它可以处理任意类型的流。
[*]有边界和无边界的流:流可以是无边界或是有边界的,如固定大小的数据集。Flink具有处理无边界流的复杂功能,但也有专用的运算符来有效地处理有边界流。
[*]实时和记录的流:所有数据都作为流生成,有两种方法可以处理数据。在生成时实时处理它或者将流持久保存到存储系统(例如文件系统或对象存储),并在之后对其进行处理。Flink应用程序可以处理记录或实时流。
状态
每个非凡的流式应用都是有状态的。只有对个别事件应用转换的应用程序才不需要状态。运行基本业务逻辑的任何应用程序都需要记住事件或中间结果,以便在之后的时间点访问它们,例如在收到下一个事件时或在特定持续时间之后。
应用程序的状态在Flink中是一等公民。您可以通过查看Flink在状态处理环境(上下文context)中提供的所有功能(函数)来查看。
[*]多状态原语:Flink为不同的数据结构提供了状态原语,如原子值(value),列表(list)或映射(map)。开发人员可以根据函数的访问模式选择最有效的状态原语。
[*]可插拔状态后端:应用程序状态由可插拔状态后端管理以及检查(checkpointed)。Flink有不同的状态后端,可以在内存或RocksDB中存储状态,RocksDB(KV DB)是一种高效的嵌入式磁盘数据存储。也可以插入自定义状态后端。
[*]精确一次的状态一致性:Flink的检查点和恢复算法可确保在发生故障时应用程序状态的一致性。因此,故障是透明处理的,不会影响应用程序的正确性。
[*]非常大的状态:由于其异步和增量检查点算法,Flink能够维持几个TB的应用程序状态。
[*]可扩展的应用程序: Flink通过将状态重新分配给更多或更少的Worker节点来支持有状态应用程序的扩展。
时间
时间是流式应用的另一个重要组成成分。大多数事件流都具有固定的时间语义,因为每个事件都是在特定的时间点生成的。此外,许多常见的流计算基于时间,例如窗口聚合、会话化、模式监测和基于时间的连接。流处理的一个重要方面是应用程序如何测量时间,即时间时间和处理时间之间的差异。
Flink提供了一组丰富的与时间相关的功能。
[*]事件时间模式:使用事件时间语义处理流的应用程序根据时间的时间戳计算结果。因此,无论是否处理记录或实时的时间,事件时间处理都是准确和一致的结果。
[*]水印支持:Flink使用水印来推断事件时间应用中的时间。水印也是一种灵活的机制,可以权衡取舍延迟数据和结果的完整性。
[*]延迟数据处理:当在事件时间模式下使用水印处理流时,可能会发生在所有相关事件到达之前已完成计算的情况。这类事件被称为延迟事件。Flink具有多种处理延迟事件的选项,例如通过边输出重新路由它们以及更新之前已经完成的结果。
[*]处理时间模式:除了事件时间模式以外,Flink还支持处理时间语义,处理时间语义的执行由处理机器的挂钟(系统)时间来触发计算。处理时间模式适用于某些具有严格的低延迟要求的应用,这些要求同时可以容忍近似结果。
分层接口API
  Flink提供三层API。每个API在简洁性和表达性之间提供不同的权衡,并针对不同的用例。
  我们简要介绍每个API,讨论它的应用程序,并展示一个代码示例。
ProcessFunctions
操作
页:
[1]