Flink-手记-4 --深入理解-核心设计与实践原理


##Flink简介
Flink是一个高吞吐、低延迟的分布式流/批处理引擎框架。
可以在无边界和有边界数据流中进行有状态的计算。
在实时处理上,它提供对事件处理的支持,解决了实时领域和传统的服务端开发领域的消息无序问题。
而且Flink还提供了 Exactly Once 语义的支持,保证了实时数据处理的正确性。
在部署方面,Flink既可以在服务器上进行独立部署(Standalone模式),也可以运行在 YARN、K8S、Mesos...等多种资源管理框架上。
Flink可以扩展部署到千台服务器构建的集群中,存储的状态甚至可以达到TB级别。


##无界和有界数据
Flink是一个能够处理任何类型数据流的框架,任何类型的数据都可以形成一种事件流。
比如:电商的购物订单、信用卡交易记录、系统产生的日志、网站或移动应用程序中用户的交互记录,
这些数据都是按照时间的顺序产生并输出到指定位置的,这些数据在流计算领域被称为:数据流。

#1、无界数据流
无界数据流可以定义数据流的开始,无法定义数据流的结束。
它们会无休止地产生数据,因此无界数据流的数据必须能被持续处理,即:数据被接收后需要立即被处理。
我们无法等到所有数据都到达后再进行处理,因为数据流中输入的数据是无限的,在任何时候,数据的输入都不会结束。
在处理无界数据时一般会以特定的顺序进行处理,
比如,根据数据的产生顺序而不是数据进入处理程序的顺序,以便推断处理结果的完整性。

#2、有界数据流
有界数据流可以定义数据流的开始,也可以定义数据流的结尾。
可以在执行任何计算之前通过获取所有数据来处理有界数据流,它非常适合需要访问全部数据才能完成的计算工作,
同时处理有界数据流不需要有序获取数据,所以有界数据流的所有数据可以被排序。


实际场景中所有的数据都是以流的方式产生的,但用户通常会使用两种截然不同的方式去处理数据,
一是在数据生成时进行实时的处理;
二是先将数据流持久化到存储系统(例如:文件系统)中,然后进行批处理操作。
而使用Flink程序则能够同时支持处理实时和历史记录的数据,像Flink这种以流为核心的架构所带来的好处就是:数据处理上具有极低的延迟。
Flink擅长处理无界和有界数据流,并且提供了统一的API,方便进行流处理和批处理的灵活切换。


部署Flink程序时,Flink会根据程序配置的"并行度"自动标识所需的资源,并从资源管理器中请求这些资源。
在发生故障的情况下,Flink通过请求新资源来替换发生故障的容器。

Flink可以在任意规模的集群上运行有状态的流处理程序。流处理程序可能会被并行化为数千个任务,
这些任务分布在集群中并发执行,所以流处理程序能够充分利用CPU、内存、磁盘和网络IO资源,
而且Flink很容易维护具有非常大状态的流处理程序,
同时Flink的异步和增量的检查点机制对处理延迟会产生最小的影响。


##运维
Flink是一个针对无界和有界数据流进行有状态计算的框架。
由于许多流处理程序旨在以最短的停机时间连续运行,因此流处理引擎必须提供出色的故障恢复能力,
以及在流/批处理程序运行期间进行监控和维护的工具。

#1、稳定运行
在分布式系统开发中,服务发生故障是无法避免的情况,
这就需要分布式系统能在服务出现故障时自动重启,同时保证当故障发生时,能持久化服务内部各个组件的当前状态,
保证当故障恢复的时候,服务能够从当前失败的地方继续正常运行,不会出现数据重复和丢失的情况,就好像故障没有发生过一样。
而Flink提供的故障恢复机制轻松地解决了这个在高并发分布式系统开发领域的棘手问题,保证了开发的流处理程序能够 7天 x 24小时稳定提供服务。

#2、升级、迁移、暂停、恢复应用服务
一般核心服务的流处理程序经常需要维护,而不是一次部署之后不再改动,
可能需要修复系统漏洞、改进业务功能,或者开发新业务、进行技术框架版本升级、进行服务扩容。
面对这种业务场景,升级一个有状态的流处理程序并不是简单的事情。
当我们重启停止的流处理程序时,必须保证不会丢失该流处理程序当前的状态信息。
为此,Flink提供了【保存点】这个组件来解决升级服务过程中记录流处理程序的状态信息...等难题。


#事件驱动型应用的优势
事件驱动型应用无须查询远程事务性数据库,本地数据访问使得它具有更高的吞吐量和更低的延迟。
由于定期向远程持久化存储系统写入检查点的工作可以异步、增量式完成,
因此对于正常事件处理的延迟影响甚微。

#流处理数据分析型应用的优势
和批处理数据分析相比,流处理数据分析省掉了周期性的数据导入和查询过程,因此从事件中获取指标的延迟更低。
同时,批处理查询必须处理那些由定期导入和输入有界性导致的人工数据边界,
而流处理查询则无须考虑这些问题。

 

##作业管理器、任务管理器、客户端
Flink集群由两种类型的进程组成:
#1、JobManager (作业管理器,也称为:Master)
负责接收客户端提交的作业和可执行JAR包...等资源,协调作业的分布式执行(调度作业中的任务到对应的任务管理器上执行),
并协调作业中的任务执行检查点操作,以及当作业发生失败后协调各个任务从检查点进行恢复...等。
一个Flink集群至少要有一个作业管理器,
在高可用的架构中会有多个作业管理器,其中一个作业管理器始终是:Leader,其它的作业管理器则是:Standby。

#2、TaskManager(任务管理器,也称为:Worker)
负责执行作业管理器分配的任务,并对数据流进行缓冲和转换。
一个Flink集群至少要有一个任务管理器。

客户端不是Flink集群中流/批处理程序执行的一部分,只负责将一个Flink作业提交到Flink集群的作业管理器中,
具体为,将提交的流/批处理程序作业转换为 JobGraph,并将其发送到Flink集群的作业管理器中。
客户端向Flink集群的作业管理器提交作业后,可以断开连接或者保持连接以接收Flink集群的作业管理器返回的该作业的进度报告。
需要明白的是,客户点可以运行在任何机器上,只要该机器可以连接到Flink集群的作业管理器即可。

 

posted @ 2021-01-31 15:45  茗::流  阅读(323)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。