标签:前置 Stream 分区 Flink 流式 API 基础理论 排序
Flink的基础理论前置学习部分
|0x00 Flink的介绍
官方介绍:持续数据流下的有状态计算框架。
官网链接:https://flink.apache.org/
中文文档:http://flink.iteblog.com/
说明:Flink很多术语,单纯的用汉语解释,会产生一定的误解。例如Stream的翻译为流,作为英文,其表示名词,作为汉语翻译,却只能表示为动词。为了避免歧义,笔者在文章中尽量通过括号的形式,来表明术语的名词含义,例如:流(Steam),即表明这是一个Flink术语,是名词。
|0x01 Flink的优点
1.丰富的流式处理用例:事件驱动型应用程序;支持流式/批量处理;支持数据通道及ETL。
2.正确性有保障:严格执行一次机制;基于事件时间的处理;复杂情况下的延迟数据处理。
3.分层API机制:流式计算SQL与批量处理数据共存;数据流API与数据集API共存;基于时间和状态的过程控制;
4.聚焦可操作性:灵活部署能力;高可用性设置;保存点功能。
5.用例可扩展性:横向扩展架构;支持海量数据处理;增量式检查点。
6.出众的性能:低延迟;高吞吐量;内存计算。
|0x02 Flink与Spark有何区别
Spark和Flink都希望能够将流处理和批处理统一起来处理,但两者的实现方式却各不相同。Spark是以批处理的技术为根本,并尝试在批处理之上支持流计算;Flink则认为流计算技术是最基本的,在流计算的基础之上支持批处理。因为这种设计理念的差异,二者存在一些比较显著的差异。例如在低延迟场景中,由于Spark是基于批处理的方式进行流式计算,因而在运行的过程中存在一些额外的开销,如果遇到对延迟的要求非常苛刻的场景,例如百毫秒甚至十毫秒级别,Flink就存在显著的优势。对于用户来说,多一个选择永远是好的,不同的技术可能带来不同的优势,用户可以根据自己业务场景的需求进行选择。两者在部署上都支持Local模式、集群模式(Standalone集群或者Yarn集群)及云端部署模式。
|0x03 Flink的前置学习之一:抽象层级
1.Flink框架的最底层是有状态的流式处理过程,类似于汇编在高级程序语言中的位置。将最基础的方法:包括流(Stream)、状态(State)及时间(Time)嵌入到API方法中,在保障一致性容错状态的前提下,通过事件时间及时间回调,方便的扩展和实现复杂的业务计算逻辑。
2.Flink框架的第二层是核心API层,是用户与Flink打交道的层级。核心API包括了DataStream和DataSet两部分API,分别对应了流式计算及批量计算方法集。这些API方法提供了用户数据处理的基础通用构件,包括了转换、联结、聚合等功能。
3.Flink框架的第三层是表API层,在流式处理过程中动态的更改表。表API遵循可扩展的关系模型,类似于关系型数据库,能够附加一些表结构,并且提供可操作的API,像Select、Join、Group by等。尽管表API可以由用户自行扩展函数,使用起来更加简洁,但它的表达性不如核心API。值得注意的是,用户可以自行在表API和核心API(DataStream/DataSet)之间做无缝转换,甚至是两者混用。
- Flink框架的最高层级是SQL,在表达方式上与表API类似,但是提供对应的SQL查询表达式。
|0x04 Flink的前置学习之二:数据流的运行过程
Flink程序的基本结构是由流(Stream)和转换(Transformation)组成的,从概念上讲,流(Stream)用于数据记录,而转换(Transformation)用于将一个或多个流作为输入或者作为结果输出。当程序被执行时,流和转换便映射到一个持续的计算数据流中,以Source作为流的起始,以Sink作为流的输出,整个过程类似于一个有向无环图:
|0xFF Flink的前置学习之三:如何并行处理数据
Flink的设计思路天生就是并行和分布式的,在程序执行期间,一个流(Stream)有多个流分区(Steam Partitions),每个操作(Operator)都有多个子操作任务(Operator Subtask),每个子操作任务都是相互独立的、运行在独立的线程中、甚至是在不同的机器上。子操作任务的个数称之为并行度(Parallelism),同一个程序不同的操作(Operator)之间可以有不同的并行度(Parallelism):
两个不同的操作(Operator)之间,数据的传递有两种方式,分别是1对1模式(One-to-one)、重新分配模式(Redistributing)。数据的传递有两个基础的条件:分区数和排序,分区数可以打乱,但分区内的排序是不变的。
(一)1对1模式(One-to-one):流(Stream)之间按照相同的分区数和排序进行数据的传递,例如上图所示的例子中,Source中的分区数和排序,与map()中的完全相同。
(二)重新分配模式(Redistributing):流(Steam)根据转换(Transformation)的方式不同(例如根据Hash重新将Key分区、随机分区等),将数据发送到不同的子操作任务(Operator Subtask),也就是每个分区将重新进行分配和处理。但值得注意的是,虽然分区是重新分配的,但每个分区中的数据排序是保留的,虽然汇总后的整体顺序是不确定的。以上图为例,map()[1]中的数据发向keyBy()[2]后,数据排序保留,但汇总到Sink[1]后,整体的数据排序是不确定的。
标签:前置,Stream,分区,Flink,流式,API,基础理论,排序
来源: https://blog.51cto.com/u_15291990/2978789
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。