Flink 概述:
Flink 是为分布式、高性能、随时可用以及准确的流处理应用框架,用于对无界和有界数据流进行有状态计算,并且以内存执行速度
和任意规模来执行计算,在保证'exactly-once'的同时具有低延迟、高吞吐的处理能力。
Flink 特点:
<1>基于事件驱动:是有状态的事件驱动,从一个或多个事件流提取数据,并根据事件的到来触发计算、状态更新或其他外部操作等。
如Kafka的消息队列几乎都是事件驱动。
<2>流批处理:
·批数据是有界、持久、大量的适合需要访问全部数据才能完成计算的工作,通常用于离线处理。
有界流数据:有明确定义的开始和结束,在执行操作之前可以获取所有数据来处理有界流,并且处理有界流不需要有序获取,
可以随时对有界数据集进行排序。
·流数据无界、实时的,无需针对整个数据集进行操作,而是对通过系统的每个数据项进行操作,通常用于处理实时数据。
无界流数据:有开始但没有结束,不会在生成时终止并提供数据,需要实时的对无界流的数据进行处理,在任何时间点都不会完成,
通常要求数据以特地的顺序获取,以便能够推断结果的完整性。
说明:
事件驱动:事件驱动不需要外部的数据库,用状态来保存中间的计算过程和结果。
关系驱动:传统的关系驱动需要借助于外部存储进行读写,通常为关系型数据库。
*Flink与Spark的区别:
计算模型不同:
>SparkStreaming 微批次处理模型,基于时间触发,高延迟。
>Flink 标准的流式处理,基于事件触发的,低延迟、高吞吐。
架构模型不同:
>SparkStreaming 任务处理依赖于Driver、Executor(Yarn模式) 或Master、Worker(Standalone模式)。
>Flink 任务的处理依赖于JobManager、TaskManager、Slot。
任务调度不同:
>SparkStreaming 会构建DAG,并且维护了一个 'DStream Graph',经过ReceiverTracker、JobGenerate、JobScheduler。
>Flink StreamGraph->JobGraph->ExecutionGraph->PhysicalGraph
时间机制不同:
>SparkStreaming 支持支处理时间。
>Flink 支持处理时间、事件时间、注入时间,更好的实现精准一次性消费,支持watermark处理滞后数据。
容错机制不同:
>SparkStreaming 支持persist对RDD进行缓存,还可以设置checkpoint用于故障恢,但只能解决数据不丢失不能解决数据重复问题。
>Flink 支持两阶段提交Checkpoint,保证精准一次。
窗口机制不同:
>SparkStreaming 的窗口先将多个批次的数据准备好,然后将多个RDD进行union汇总,并且窗口大小必须是批次大小的整数倍,否则窗口会将
某个批次的数据且分开,会破坏数据的完整性。
>Flink:Flink的窗口是先将每个窗口准备好,等到数据流的到来,每来一条数据处理一次,对窗口大小没有特定需求。
CEP的支持:Flink内置CEP,而Spark没有内置CEP。
Flink 分层API:
Stateful Stream Processing、DataStream/DataSet API、TableAPI、SQL。
最底层级的抽象仅仅提供了有状态流,它将通过过程函数被嵌入到DataStream API中。
Flik流批一体:
Flink内部有两套不同数据处理方式的API,DataStream和DataSet。
DataSource底层是一个operator算子,该算子底层是DataSet。
DataStreamSource底层是DataStream。
说明:Flink1.12 版本的流批一体存在一些BUG,批处理API处理数据输出结果时经过reduce
后的结果如果只有一个数据不会进入reduce,并且批处理不会保存状态。
Flink 运行模式:
LocalCluster模式> 本地集群模式,通常用于测试和学习,是默认模式。
Standalone模式> 独立集群模式,支持Web UI界面提交Flink应用。
Standalone模式高可用:解决单点故障问题,主备 JobManager 实例之间没有明显的区别,同时启动多个Jobmanager,
其中一个为leader其他为standby,当leader挂了,其他的才会有一个成为leader。
说明: default、Standlone模式下通过 'flink run -m hostname:8081 -c '提交任务。
Standalone高可用模式下,需要启动zk、Hdfs并且flink中没有hadoop的jar包,需要在环境变量中添加flink所需的hadoop环境变量。
Yarn模式> 独立部署模式,会动态的分配TaskManager资源,不需要启动flink集群,Yarn会根据任务自动的启动master和workers,
有任务时分配资源,没有任务时不占用资源,且Flink Yarn模式是Flink的一个客户端不需要分发。
说明:Yarn模式由Flink自身提供计算资源,无需其他框架提供资源,但是Flink主要用来计算,自身提供的资源调度并不如外部集成好,
所以采用集成外部Yarn。
<Session-Cluster>会先在Yarn启动一个Flink集群,向Yarn申请资源,多个任务共享这个集群的资源,存在资源争抢,并且任务会相互影响。
缺点: 如果提交的作业中有长时间执行的大作业,占用了该Flink集群的所有资源,则后续无法提交新的job,所以该模式适合
需要频繁提交的多个小Job,且执行时间都不长。
说明: Session-Cluster模式下先通过 'bin/yarn-session.sh -d ' 后台启动一个Flink集群,然后再通过 'bin/flink run -c'
提交任务, 在session-Cluster模式和standalone模式都存在时,由于会先去寻找session-Cluster环境,
如果想跳过session-Cluster模式,使用standalone模式的话可以通过 -m 指定Jobmanager(地址:web端口),
会直接使用standalone模式的flink。
<Per-Job-Cluster>每个任务都会在yarn上单独启动一个集群,任务的执行互不干扰。推荐使用perjob和application模式。
说明: Per-Job-Cluster 模式下,通过 ' bin/flink run -t yarn-per-job -c ' 提交任务,如果有多个session集群时,
手动指定yarn-Session集群 ' bin/flink run -t yarn-session -Dyarn.application.id=application_XXXX_YY '
<Application Mode>与Perjob模式类似,区别在于代码的主方法在集群执行,而Perjob的mian方法在用户提交代码的客户端执行。
说明: Application Mode模式下,通过 ' bin/flink run-application -t yarn-application -c ' 提交任务。
Yarn高可用:只有一个Master,但是提供了重试机制。在flinkyarn的配置文件中不用配集群id,Yarn模式默认将Applicationid作为集群id,
如果配置了会导致所有的集群id都是同一个会导致冲突。
Flink 运行架构:
Client:用于将DataStream发送的JobManager,可以与Jobmanager保持连接也可以断开连接。
JobManager:作为Master,控制程序执行的主进程,类似大哥,用于接收JobGraph、LogicalDataflowGraph、其他资源JAR包,然后将JobGraph转换
成一个物理层面的数据流图ExecutionGraph,它包含了所有可以并发执行的任务。JobManager需要向内置的RM申请资源。
JobManager内置的三组件:
ResourceManager> 是Flink内置的资源调度器,整个集群只有一个。主要负责管理任务管理器的Slot资源。
说明:当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager,如果资源不够,

本文详细介绍了Flink流处理的各个方面,包括Flink的概述、特点、与Spark的区别、运行模式、运行架构、并行度与Slot的关系、状态管理、容错机制、以及CEP复杂事件处理。重点讨论了Flink的事件驱动、流批处理能力、JobManager和TaskManager的角色、以及检查点和SavePoint机制,展示了Flink如何在保证精确一次语义的同时实现低延迟、高吞吐的流处理。
最低0.47元/天 解锁文章
2493

被折叠的 条评论
为什么被折叠?



