Flink基础之为什么选择Flink

目录

前言:

1、连续事件处理的目标

2、流处理技术的演变

Lambda 架构概述:优势和局限性

批处理与流处理


前言:

我们渴望按照流的方式处理数据,但要做好很困难;随着大规模数据在各行各业中出现,难度越来越大。这是一个属于物理学范畴的难题:在大型 分布式系统中,数据一致性和对事件发生顺序的理解必然都是有限的。伴随着方法和技术的演化,我们尽可能使这种局限性不危及商业目标和运营目标。
在这样的背景下, Apache Flink (以下简称 Flink )应运而生。作为在公共社 区中诞生的开源软件,Flink 为大容量数据提供流处理,并用同一种技术实现批处理。

1、连续事件处理的目标

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

2、流处理技术的演变

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

为了处理这种情况,有些用户开发出了自己的流处理系统。在开源世界里, Apache Storm 项目(以下简称 Storm )是流处理先锋。 Storm 最早由 Nathan Marz 和创业公司 BackType (后来被 Twitter 收购)的一个团队开发,后来 才被 Apache 软件基金会接纳。 Storm 提供了低延迟的流处理,但是它为实 时性付出了一些代价:很难实现高吞吐,并且其正确性没能达到通常所需
的水平。换句话说,它并不能保证 exactly-once ;即便是它能够保证的正确 性级别,其开销也相当大。

Lambda 架构概述优势和局限性

对低成本规模化的需求促使人们开始使用分布式文件系统,例如 HDFS 和基于批量数据的计算系统(MapReduce 作业)。但是这种系统很难做 到低延迟。用 Storm 开发的实时流处理技术可以帮助解决延迟性的问 题,但并不完美。其中的一个原因是,Storm 不支持 exactly-once 语义, 因此不能保证状态数据的正确性,另外它也不支持基于事件时间的处 理。有以上需求的用户不得不在自己的应用程序代码中加入这些功能。 后来出现了一种混合分析的方法,它将上述两个方案结合起来,既保 证低延迟,又保障正确性。这个方法被称作 Lambda 架构,它通过批 量 MapReduce 作业提供了虽有些延迟但是结果准确的计算,同时通过 Storm 将最新数据的计算结果初步展示出来。
Lambda 架构是构建大数据应用程序的一种很有效的框架,但它还不够 好。举例来说,基于 MapReduce HDFS Lambda 系统有一个长达 数小时的时间窗口,在这个窗口内,由于实时任务失败而产生的不准 确的结果会一直存在。Lambda 架构需要在两个不同的 API application programming interface,应用程序编程接口)中对同样的业务逻辑进行 两次编程:一次为批量计算的系统,一次为流式计算的系统。针对同 一个业务问题产生了两个代码库,各有不同的漏洞。这种系统实际上 非常难维护。
 
若要依靠多个流事件来计算结果,必须将数据从一个事件保 留到下一个事件。这些保存下来的数据叫作计算的状态。准确处理状态对于计算结果的一致性至关重要。在故障或中断 之后能够继续准确地更新状态是容错的关键。
 
在低延迟和高吞吐的流处理系统中维持良好的容错性是非常困难的,但是 为了得到有保障的准确状态,人们想出了一种替代方法:将连续事件中的 流数据分割成一系列微小的批量作业。如果分割得足够小(即所谓的微批 处理作业),计算就几乎可以实现真正的流处理。因为存在延迟,所以不 可能做到完全实时,但是每个简单的应用程序都可以实现仅有几秒甚至几亚秒的延迟。这就是在 Spark 批处理引擎上运行的 Apache Spark Streaming 为何选择Flink 7 (以下简称 Spark Streaming )所使用的方法。 更重要的是,使用微批处理方法,可以实现 exactly-once 语义,从而保障状 态的一致性。如果一个微批处理作业失败了,它可以重新运行。这比连续 的流处理方法更容易。Storm Trident 是对 Storm 的延伸,它的底层流处理引擎就是基于微批处理方法来进行计算的,从而实现了 exactly-once 语义,但是在延迟性方面付出了很大的代价。
然而,通过间歇性的批处理作业来模拟流处理,会导致开发和运维相互交错。完成间歇性的批处理作业所需的时间和数据到达的时间紧密耦合,任何延迟都可能导致不一致(或者说错误)的结果。这种技术的潜在问题是,时间由系统中生成小批量作业的那一部分全权控制。Spark Streaming 等一些流处理框架在一定程度上弱化了这一弊端,但还是不能完全避免。另外,使用这种方法的计算有着糟糕的用户体验,尤其是那些对延迟比较敏感的作业,而且人们需要在写业务代码时花费大量精力来提升性能。
为了实现理想的功能,人们继续改进已有的处理器(比如 Storm Trident 的开发初衷就是试图克服 Storm 的局限性)。当已有的处理器不能满足需求时,产生的各种后果则必须由应用程序开发人员面对和解决。以微批处理方法为例,人们往往期望根据实际情况分割事件数据,而处理器只能根据批量作业时间(恢复间隔)的倍数进行分割。当灵活性和表现力都缺乏的时候,开发速度变慢,运维成本变高。于是,Flink 出现了。这一数据处理器可以避免上述弊端,并且拥有所需的
诸多功能,还能按照连续事件高效地处理数据。 Flink 的一些功能如图 下图所示。
Storm Spark Streaming 类似,其他流处理技术同样可以提供一些有 用的功能,但是没有一个像 Flink 那样功能如此齐全。举例来说, Apache Samza(以下简称 Samza )是早期的一个开源流处理器,它不仅没能实现exactly-once 语义,而且只能提供底层的 API ;同样, Apache Apex 提供了与 Flink 相同的一些功能,但不全面(比如只提供底层的 API ,不支持事件时间,也不支持批量计算)。这些项目没有一个能和 Flink 在开源社区的规模上相提并论。
Flink 的一个优势是,它拥有诸多重要的流式计算功能。其他项目为了实现 这些功能,都不得不付出代价。比如,Storm 实现了低延迟,还做不到高吞吐,也不能在故障发生时准确地处理计算状态;Spark Streaming通过采用微批处理方法实现了高吞吐和容错性,但是牺牲了低延迟和实时处理能力,也不能使窗口与自然时间相匹配,并且表现力欠佳。

3、初探Flink

Flink 的主页在其顶部展示了该项目的理念:“Apache Flink 是为分布式、高 性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。”Flink 不仅能提供同时支持高吞吐和 exactly-once 语义的实时计算,还能提供批量 数据处理,这让许多人感到吃惊。鱼与熊掌并非不可兼得,Flink 用同一种 技术实现了两种功能。

批处理与流处理

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

Flink 的核心计算构造是图 1-4 中的 Flink Runtime 执行引擎,它是一个分 布式系统,能够接受数据流程序并在一台或多台机器上以容错方式执行。 Flink Runtime 执行引擎可以作为 YARN Yet Another Resource Negotiator )的应用程序在集群上运行,也可以在 Mesos 集群上运行,还可以在单机上 运行(这对于调试 Flink 应用程序来说非常有用)。
上图是Flink 技术栈的核心组成部分。值得一提的是, Flink 分别提供了面向流处理 的接口(DataStream API )和面向批处理的接口( DataSet API )。因此, Flink 既 可以完成流处理,也可以完成批处理。Flink 支持的拓展库涉及机器学习( FlinkML )、 复杂事件处理(CEP ),以及图计算( Gelly ),还有分别针对流处理和批处理的 Table API
 
能被 Flink Runtime 执行引擎接受的程序很强大,但是这样的程序有着冗长 的代码,编写起来也很费力。基于这个原因,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 解决了许多问题,比如保证了 exactly-once 语义和基于 事件时间的数据窗口。开发人员不再需要在应用层解决相关 问题,这大大地降低了出现 bug 的概率。
因为不用再在编写应用程序代码时考虑如何解决问题,所以工程师的时间 得以充分利用,整个团队也因此受益。好处并不局限于缩短开发时间,随 着灵活性的增加,团队整体的开发质量得到了提高,运维工作也变得更容 易、更高效。Flink 让应用程序在生产环境中获得良好的性能。

4、为什么选择Flink

“为何选择 Flink”这一问题。比这个问题更大的则是“为何要用流数据?

比如在许多情况下,我们都需要 观察和分析连续事件产生的数据。与其说流数据是特别的,倒不如说它是 自然的——只不过从前我们没有流处理能力,只能做一些特殊的处理才能 真正地使用流数据,比如将流数据攒成批量数据再处理,不然无法进行大 规模的计算。

使用流数据并不新鲜,新鲜的是我们有了新技术,从而可以 大规模、灵活、自然和低成本地使用它们。

Flink 并不是唯一的流处理工具。人们正在开发和改进多种新兴的技术,以满足流处理需求。显然,任何一个团队选择某一种技术都是出于多方面的 考虑,包括团队成员的已有技能。但是 Flink 的若干优点、易用性,以及使 用它所带来的各种好处,使它变得非常有吸引力。另外,不断壮大且非常 活跃的 Flink 社区也暗示着它值得一试。你会发现“为何选择 Flink ”这个 问题变成了“为何不选择 Flink 呢?”
发布了496 篇原创文章 · 获赞 464 · 访问量 86万+

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/103837849