Flink基础教程
前言
apache flink是一种高度创新的开源流处理器,具备惊人的潜力,能够帮助你在以流为基础的各种计算中获益.
flink用同一种技术底层技术来实现流处理和批处理.
第一章 为何选择flink
许多系统都会产生事件流.流数据更真实地反映了我们的生活.
流处理是一项专业性强且极具挑战性的技术.
flink为大容量数据提供流处理,并用同一种数据实现批处理.
在现代零售业中,网站点击量代表了销量.
流处理适合参与对当前业务状态的实时分析.
物联网是流数据被普遍应用的领域.在物联网中,低延迟的数据传输和处理,以及准确的数据分析通常很关键。各类仪器中的传感器频繁地获得测
量数据,并将它们以流的形式传输至数据中心。在数据中心内,实时或者接近实时的应用程序将更新显示板,运行机器学习模型,发布警告,并就许多不同的服务项目提供反馈。
在全球化经济中,能够提供24小时服务变得越来越重要.
在许多情况下,人们希望用低延迟或实时的流处理来获得数据的高时效性,前提是流处理本身是准确且高效的.
对低成本规模化的需求促使人们开始使用分布式文件系统.
lamda架构通过批量MapReduce作业提供了虽有些延迟但是结果准确的计算,同时通过storm将最近数据的计算结果初步展示出来.
若要依靠多个流事件来计算结果,必须将数据从一个事件保留到下一个事件.这些保存下来的数据叫计算的状态.准确处理状态对于计算结果的一致性至关重要.在故障或中断之后能够继续准确地更新状态是容错的关键.
flink的一个优势是它拥有诸多重要的流式计算功能.
Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架.它不仅能提供同时支持高吞吐和 exactly-once 语义的实时计算,还能提供批量数据处理.
Flink 将批处理(即处理有限的静态数据)视作一种特殊的流处理.
Flink 提供了用于流处理的 DataStream API 和用于批处理的 DataSet API.
Flink可以用来做电子商务的在线推荐功能.
流数据被使用的原因是我们需要观察和分析连续事件产生的数据.
第二章 流处理架构
数据架构设计领域正在发生一场变革,其影响不仅限于实时或近实时的项目。这场变革将基于流的数据处理流程视为整个架构设计的核心.
Flink 能有效工作的数据架构,恰恰是充分利用流数据的基础.
分布式文件系统则用来存储不需要经常更新的数据,它们也往往是大规模批量计算所依赖的数据存储方式。
以流为基础的架构设计让数据记录持续地从数据源流向应用程序,并在各个应用程序间持续流动。没有一数据库来集中存储全局状态数据,取而代之的是共享且永不停止的流数据,它是唯一正确的数据源,记录了业务数据的历史。在流处理架构中,每个应用程序都有自己的数据,这些数据采用本地数据库或分布式文件进行存储。
通过设置消息传输层(从各种数据源采集连续事件产生的数据,并传输给订阅了这些数据的应用程序和服务)和流处理层(三点作用:①持续地将数据在应用程序和系统间移动;②聚合并处理事件;③在本地维持应用程序的状态)可以实现流处理架构并从 Flink 中获益。
Kafka 和MapR Streams作为消息传输系统,兼具高性能和持久性(可重播和再计算)。
采用解耦的消息传输系统的意义在于它能支持微服务,也支持将处理步骤中的实现过程隐藏起来,从而允许自由地修改实现过程。
微服务方法指的是将大型系统的功能分割成通常具有单一目的的简单服务,从而使小型团队可以轻松地构建和维护这些服务。它称为了敏捷的基础。流处理架构不需要集中式数据库。取而代之的是消息队列,它作为共享数据源,服务于各种不同的消费者。
流处理架构通过一个合适的消息传输系统(Kafka 或 MapR Streams)和一个多用途、高性能的流处理
器(Flink),能支持各种应用程序使用共享数据源,即消息流。
流处理应用程序可以通过订阅消息队列中的流数据来实时更新仪表盘。
数据中心之间的数据复制需要保存消息偏移量,这一点最有用,因为它使得任何数据中心的更新都可以被传播到其他数据中心,且允许双向和循环的数据复制。
MapR Streams有跨数据中心的流复制能力。
第三章 flink的用途
流处理器(尤其是 Flink)的正确性体现在计算窗口的定义符合数据产生的自然规律。
Flink 可以根据真实情况设置计算窗口。
Flink 解决了可能影响正确性的几个问题,包括如何在故障发生之后仍能进行有状态的计算。Flink 所用的技术叫作检查点。检查点也是 Flink 能够按需重新处理数据的关键所在。
流处理架构可以分步来实现。
第四章 对时间的处理
事件流数据(如微博内容、点击数据和交易数据)不断产生,我们需要用 key 将事件分组,并且每隔一段时间(比如一小时)就针对每一个 key 对应的事件计数。这是众所周知的“大数据”应用。
流处理区别于批处理最主要的两点是:流即是流,不必人为地将它分割为文件;时间的定义被明确地写入应用程序代码(如以上代码的时间窗口),而不是与摄取、计算和调度等过程牵扯不清。
在流处理中,主要有两个时间概念:1) 事件时间(事件实际发生的时间,每一个事件都有一个与它相关的时间戳,并且时间戳是数据记录的一部分,事件时间其实就是时间戳);2) 处理时间(事件被处理的时间,处理时间其实就是处理事件的机器所测量的时间);3)摄取时间,也叫作进入时间,指的是事件进入流处理框架的时间。
flink支持时间窗口(支持滚动和滑动)和计数窗口(分组依据不再是时间戳,而是元素的数量)和会话窗口(指的是活动阶段,其前后都是非活动阶段)。
支持事件时间对于流处理架构而言至关重要,因为事件时间能保证结果正确,并使流处理架构拥有重新处理数据的能力。
Flink 通过水印(可以由开发人员设定)来推进事件时间。水印是嵌在流中的常规记录,计算程序通过水印获知某个时间点已到。
Kappa架构:数据流是设计核心;数据源不可变更;架构采用像 Flink这样的单一流分析框架处理新鲜数据,并通过流重播处理历史数据。
flink对事件时间的支持很重要,这有助于准确识别异常和有助于采用流处理架构。
第五章 有状态的计算
流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。
有状态的计算则会基于多个事件输出结果。
新一代的流处理系统则将状态及其正确性视为重中之重。
在流处理中,一致性分为 3 个级别(at most once,at least once,exactly once).
Flink 的一个重大价值在于,它既保证了 exactly-once(检查点的特性),也具有低延迟和高吞吐的处理能力。
与 Storm 相比,Flink 的硬件成本或云计算成本仅为前者的 1/30,同样的硬件能处理的数据量则是前者的 30 倍。