大数据实时流处理场景化解决方案--实时处理技术框架介绍--flink
Flink
Flink概述
• Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎,对无界和有界数据流进行状态计算。
• Flink可以部署在各种资源提供者(如YARN,Apache Mesos和Kubernetes)上,也可以作为裸机硬件上的独立群集。配置为高可用性,Flink没有单点故障,提供高吞吐量和低延迟,并为世界上最苛刻的流处理应用程序提供支持。
• Flink以event为粒度进行计算。
• 有70多个来自学术界和工业界贡献者,从而使得flink项目不断成长。
• 从2014年12月起,成为Apache社区顶级孵化项目。
为什么选择Flink?
• Flink是一个开源的分布式流式处理框架。
• 提供准确的结果,甚至在出现无序或者延迟加载的数据的情况下;
• 它是状态化的容错的,同时在维护一次完整的的应用状态时,能无缝修复错误;
• 大规模运行,在上千个节点运行时有很好的吞吐量和低延迟。
Flink应用场景
• Flink最适合的应用场景是低时延的数据处理场景:高并发处理数据,时延毫秒级,且兼具可靠性。
• 典型应用场景有:
• 欺诈识别
• 异常检测
• 基于规则的警报
• 业务流程监控
• Web应用程序(社交网络)
Fink架构图
• Flink提供了三种部署方案local,Cluster,Cloud即:本地部署,集群部署和云部署。
• Runtime层是Flink流处理以及批处理时共用的一个引擎,以JobGraph形式接收程序。JobGraph即为一个一般化的并行数据流图(data flow),它拥有任意数量的Task来接收和产生data stream。
• DataStream API和DataSet API都会使用单独编译的处理方式生成JobGraph。DataSet API使用optimizer来决定针对程序的优化方法,而DataStream API则使用stream builder来完成该任务。
• Libraries层对应的是Flink不同的API对应的一些功能:处理逻辑表查询的Table,机器学习的FlinkML,图像处理的Gelly,复杂事件处理的CEP。
流数据的连续处理
• 无界流:有定义流的开始,但没有定义流的结束。数据源会无休止地产生数据。无界流的数据必须持续处理,即数据被读取后需要立刻处理。不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
• 有界流:有定义流的开始,也有定义流的结束。有界流可以在读取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。
• Apache Flink 擅长处理无界和有界数据集:精确的时间控制和状态化使得 Flink 的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。
处理模式类型
• 事件时间:事件时间是每条事件在它产生的时候记录的时间,该时间记录在事件中,在处理的时候可以被提取出来。例如,小时的时间窗处理将会包含事件时间在该小时内的所有事件,而忽略事件到达的时间和到达的顺序。
• 处理时间:当前机器处理该条事件的时间。
• 对于大多数流媒体应用程序而言,能够使用用于处理实时数据的相同代码重新处理历史数据并生成确定的,一致的结果是非常有价值的。
• 注意事件发生的顺序,而不是它们被处理的顺序,以及能够推断一组事件何时(或应该)完成,这也是至关重要的。例如,考虑电子商务交易或金融交易中涉及的一系列事件。通过使用记录在数据流中的事件时间时间戳,而不是使用处理数据的机器的时钟,可以满足这些对及时流处理的要求。
Flink窗口
• Flink支持基于时间窗口操作,也支持基于数据的窗口操作:
• 按分割标准划分:timeWindow、countWindow。
• 按窗口行为划分:Tumbling Window、Sliding Window、自定义窗口。
• 窗口按驱动的类型分为时间窗口(timeWindow)和事件窗口(countWindow)。窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。
• 窗口按照其想要实现的功能分为:翻滚窗口(Tumbling Window,无时间重叠,固定时间划分或者固定事件个数划分),滚动窗口(Sliding Window,有时间重叠),和会话窗口(Session Window,将事件聚合到会话窗口中,由非活跃的间隙分隔开)。
• 滑动窗口:对于某些应用,它们需要的窗口是不间断的,需要平滑地进行窗口聚合。比如,我们可以每30秒计算一次最近一分钟用户购买的商品总数。这个就是时间滑动窗口。
• 比如我们可以每10个客户点击购买,计算一次最近100个客户购买商品的总和,这个就是事件滑动窗口。
Flink容错功能
• Checkpoint机制是Flink运行过程中容错的重要手段。
• Checkpoint机制不断绘制流应用的快照,流应用的状态快照被保存在配置的位置(如:JobManager的内存里,或者HDFS上)。
• Flink分布式快照机制的核心是barriers,这些barriers周期性插入到数据流中,并作为数据流的一部分随之流动。
• barrier是一个特殊的元组,这些元组被周期性注入到流图中并随数据流在流图中流动。每个barrier是当前快照和下一个快照的分界线。
• 在同一条流中barriers并不会超越其前面的数据,严格的按照线性流动。一个barrier将属于本周期快照的数据与下一个周期快照的数据分隔开来。每个barrier均携带所属快照周期的ID,barrier并不会阻断数据流,因此十分轻量。
Checkpoint机制
• Checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因 (如异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。
• 该机制可以保证应用在运行过程中出现故障时,应用的所有状态能够从某一个检查点恢复,保证数据仅被处理一次 (Exactly Once)。另外,也可以选择至少处理一次(at least once)。
Flink应用程序
• 用户实现的Flink程序是由Stream数据和Transformation算子组成。
• Stream是一个中间结果数据,而Transformation是算子,它对一个或多个输入Stream进行计算处理,输出一个或多个结果Stream。
• Sink:数据输出,支持HDFS、Kafka、文本等。
• Flink程序执行时,它会被映射为Streaming Dataflow。一个Streaming Dataflow是由一组Stream和Transformation Operator组成,它类似于一个DAG图,在启动的时候从一个或多个Source Operator开始,结束于一个或多个Sink Operator。
• Source:流数据源的接入,支持HDFS文件、kafka、文本数据等。
• Sink:数据输出,支持HDFS、kafka、文本等。
• Stream是Flink计算流程中产生的中间数据。Flink是按event驱动的,每个event都有一个event time就是事件的时间戳,表明事件发生的时间,这个时间戳对Flink的处理性能很重要,后面会讲到Flink处理乱序数据流时,就是靠时间戳来判断处理的先后顺序。
DataStream数据流转
• Data source:流数据源的接入,支持HDFS文件、kafka、文本数据等。
• Transformations:流数据转换。
• Data sink:数据输出,支持HDFS、kafka、文本等。
• 用户实现的Flink程序是由Stream数据和Transformation算子组成。
• Stream是一个中间结果数据,而Transformation是算子,它对一个或多个输入Stream进行计算处理,输出一个或多个结果Stream。
Data source:流数据源的接入,支持HDFS文件、kafka、文本数据等