为啥选择Flink?

人们对某件事的正确理解往往来自基于有效论据的结论。
要获得这样的结论,最有效的方法就是沿着事件发生的轨迹进行分析。
数据流:是指由连续数据组成的流;流数据:是指数据流中的数据。
在数据库处理不好时,流处理器提供了更好的解决方案。
《Flink基础教程》。

Flink出现的背景

连续的事件流

 许多系统都会产生连续的事件流,如行驶中的汽车发射出GPS信号,金融交易,移动通信基站与繁忙的智能手机进行信号交换,网络流量,机器日志,工业传感器和可穿戴设备的测量结果,等等。
 如果能够高效地分析大规模流数据,我们对上述系统的理解将会更清楚、更快速。
 简而言之,流数据更真实地反映了我们的生活方式。

物理学范畴的难题

 在大型分布式系统中,数据一致性和对事件发生顺序的理解必然都是有限的。
 伴随着方法和技术的演化,我们尽可能使这种局限性不危及商业目标和运营目标。

商业目标

 作为在公共社区中诞生的开源软件,Flink为大容量数据提供流处理,并用同一种技术实现批处理。
 从流处理的好处出发–判断以流为基础的数据处理方法是否适合自己的商业目标。

大规模实时数据处理

行业应用

零售业和市场营销:网站点击量就代表了销量。
航空旅客服务业:航空公司需要快速、准确地处理从各种渠道获得的大量数据。
物联网:在物联网中,低延迟的数据传输和处理,以及准确的数据分析通常很关键。
交通运输业、智能”汽车,或称联网汽车。
智能计量表:定期将用电量反馈给公司 (例如每15分钟一次),通过机器学习模型来检测设备故障或者窃电等使用异常。
电信业:在某个移动通信基站出现流量高峰前预先将流量分配给其他的基站,在断电时快速做出反应。
银行和金融业:从事零售业务的银行不希望客户交易被延迟或者因为错误统计而造成账户余额出错。
风控:信用卡欺诈检测需要及时的监控和反馈。对异常登录的检测能发现钓鱼式攻击,从而避免巨大的损失。

连续事件处理的目标

 低延迟和高吞吐、可以处理中断。
 优秀的流处理技术应该能使系统在崩溃之后重新启动,并且产出准确的结果;
 或者说,优秀的流处理技术可以容错,而且能保证exactly-once(恰好一次)。
 与此同时,获得这种程度的容错性所采用的技术还需要在没有数据错误的情况下不产生太大的开销。
 这种技术需要能够基于事件发生的时间(而不是随意地设置处理间隔)来保证按照正确的顺序跟踪事件。
 对于开发人员而言,不论是写代码还是修正错误,系统都要容易操作和维护。
 同样重要的是,系统生成的结果需要与事件实际发生的顺序一致,比如能够处理乱序事件流(一个很不幸但无法避免的事实),以及能够准确地替换流数据(在审计或者调试时很有用)。

流处理技术的演变

分开处理连续的实时数据和有限批次的数据,可以使系统构建工作变得更加简单,但是这种做法将管理两套系统的复杂性留给了系统用户:应用程序的开发团队和DevOps团队需要自己使用并管理这两套系统。

 在开源世界里,Apache Storm项目是流处理先锋。
 Lambda架构:一种混合分析的方法,通过批量MapReduce作业提供了虽有些延迟但是结果准确的计算,同时通过Storm将最新数据的计算结果初步展示出来。

若要依靠多个流事件来计算结果,必须将数据从一个事件保留到下一个事件。这些保存下来的数据叫作计算的状态。准确处理状态对于计算结果的一致性至关重要。在故障或中断之后能够继续准确地更新状态是容错的关键。

Spark Streaming

 在低延迟和高吞吐的流处理系统中维持良好的容错性是非常困难的,但是为了得到有保障的准确状态,人们想出了一种替代方法:
 将连续事件中的流数据分割成一系列微小的批量作业。如果分割得足够小(即所谓的微批 处理作业),计算就几乎可以实现真正的流处理。
 因为存在延迟,所以不可能做到完全实时,但是每个简单的应用程序都可以实现仅有几秒甚至几亚秒的延迟。
 这就是在Spark批处理引擎上运行的Apache Spark Streaming【Structured Streaming参见官方文档】所使用的方法。
 更重要的是,使用微批处理方法,可以实现exactly-once语义,从而保障状态的一致性。
 如果一个微批处理作业失败了,它可以重新运行,这比连续的流处理方法更容易。

 转折,然而😄
 通过间歇性的批处理作业来模拟流处理,会导致开发和运维相互交错。
 完成间歇性的批处理作业所需的时间和数据到达的时间紧密耦合,任何延迟都可能导致不一致(或者说错误)的结果。
 这种技术的潜在问题是,时间由系统中生成小批量作业的那一部分全权控制。
 Spark Streaming等一些流处理框架在一定程度上弱化了这一弊端,但还是不能完全避免。
 另外,使用这种方法的计算有着糟糕的用户体验,尤其是那些对延迟比较敏感的作业,而且人们需要在写业务代码时花费大量精力来提升性能。

实现理想

 继续改进已有的处理器,当已有的处理器不能满足需求时,产生的各种后果则必须由应用程序开发人员面对和解决。

 Perfect.

image

Flink赞美歌

 在德语中,flink一词表示快速和灵巧。
 flink项目采用一只松鼠的彩色图案作为logo,这不仅因为松鼠具有快速和灵巧的特点,还因为柏林的松鼠有一种迷人的红棕色。
 2014年12月成为Apache软件基金会的顶级项目。

 Flink是如何同时实现批处理与流处理的呢?答案是,Flink将批处理(即处理有限的静态数据)视作一种特殊的流处理。

image

 Flink的核心计算构造是Flink Runtime执行引擎,它是一个分布式系统,能够接受数据流程序并在一台或多台机器上以容错方式执行。
 Flink Runtime执行引擎可以作为YARN(Yet Another Resource Negotiator)的应用程序在集群上运行,也可以在Mesos集群上运行,还可以在单机上运行(Minicluster),【K8s参阅相关文档】。

 Flink提供了封装在Runtime执行引擎之上的API,以帮助用户更方便地生成流式计算程序。
 Flink提供了用于流处理的DataStream API和用于批处理的DataSet API。
 尽管Flink Runtime执行引擎是基于流处理的,但是DataSet API先于DataStream API被开发出来,这是因为工业界对无限流处理的需求在Flink诞生之初并不大。

 DataStream API可以流畅地分析无限数据流,并且可以用Java或者Scala来实现。
 开发人员需要基于一个叫DataStream的数据结构来开发,这个数据结构用于表示永不停止的分布式数据流。

 Flink的分布式特点体现在它能够在成百上千台机器上运行,它将大型的计算任务分成许多小的部分,每个机器执行一个部分。
 Flink 能够自动地确保在发生机器故障或者其他错误时计算能持续进行,或者在修复bug或进行版本升级后有计划地再执行一次。
 这种能力使得开发人员不需要担心失败。
 Flink本质上使用容错性数据流,这使得开发人员可以分析持续生成且永远不结束的数据(即流处理)。

 好处并不局限于缩短开发时间,随着灵活性的增加,团队整体的开发质量得到了提高,运维工作也变得更容易、更高效。
 Flink让应用程序在生产环境中获得良好的性能。

【完】

GitHub flink-training-exercises
GitHub sql-training
本文知识来源于书本,仅供快速浏览学习,勿盲目转载
GitHub flink-training-course/课程表(持续更新)

邵志鹏 wechat
扫一扫上面的二维码关注我的公众号
0%