Flink的入门

一、Flink 简介
Flink是一个分布式的流处理框架,它能够对有界和*的数据流进行高效的处理。Flink的核心是流处理,当然它也支持批处理,Flink将批处理看成为流处理的一种特殊情况,即数据流也是有明确界限的。这和Spark Streaming是思想是相反的,Spark Streaming的核心是批处理,它将流处理看成批处理的一种特殊情况,即把数据流进行极小粒度的拆分,拆分为多个微批处理。

扩展

flink在内部有一个缓存块为单位进行网络数据传输,用户可以自己配置这个缓存块的超过时间,如果缓存块的超过时间设置为0,则flink的数据传输就是"全实时",系统处理方式就是最低限度的延迟,如果这个缓存块的超过时间设置为无限大,那么flink在处理数据上就类似于批式处理。

二、Flink 核心架构
Flink采用分层的架构涉及,从而保证各层在功能和职责上的清晰,从上而下分别是API&Libraries层、Runtime核心层以及物理部署层。

2.1,API&Libraries层
这一层提供了编程API和顶层类库:

  • 编程API:用于进行流式的DataStream API和用于批处理的DataSet API
  • 顶层类库:包括用于复杂事件处理的CEP库:用于结构化数据查询SQL和Table库,以及基于批处理的机器学习库FlinkML和图处理库Gelly。

2.2 Runtime核心层
Flink分布式计算框架的核心实现层,包括作业转换、任务调度、资源分配、任务执行等功能,基于这一层的实现,可以在流式引擎下同时运行流处理程序和批处理程序。

2.3 物理部署层
Flink的物理部署层,用于支持在不同平台上部署运行Flink应用。

三、Flink分层API

针对API&Libraries这一层,Flink又进行了更为具体的划分:
Flink的入门
1,SQL & Table API
SQL & API 同时适用于批处理和流处理,用户可以对有界数据和*数据流以相同的语义进行查询,并产生相同的结果。除了基本的查询以外,它还支持自定义的标量函数,聚合函数以及表值函数,可以满足多样化的查询需求。

2,DataStream & DataSet API
DataStream & DataSet API是Flink数据处理的核心API,支持Java语言和或Scala语言进行调用,提供了数据读取,数据转换和数据输出等一系列常用操作的封装。

3,Stateful Stream Processing
Stateful Stream Processing是最低级别的抽象,它通过Process Function函数内嵌到DataStream API中。

四、Flink集群架构

1,核心组件
Flink核心架构的第二层是Runtime层,该层采用标准的Master-Slave结构。其中,Master部分又包含了三个核心组件:Dispatcher、ResourceManager和JobManager,而Slave则主要是TaskManager进程。

  • JobManagers(也称为masters):JobManagers接收由Dispatcher传递过来的执行程序。该程序包含了作业图(JobGraph),逻辑数据流图(logical dataflow graph)及其所有的classes文件以及第三方类库(libraites)等等。紧接着JobManagers会将JobGraph转换为执行图(ExecutionGraph),然后向ResourceManager申请资源来执行该任务,一旦申请到资源,就将执行图分发给对应的TaskManagers。因此每个作业(Job)至少有一个JobManager;高可用部署下可用有多个JobManagers,其中一个可作为leader,其余的处于standy状态。
  • TaskManagers(也称为works):TaskManagers负责实际的子任务(subtasks)的执行,每个TaskManagers都拥有一定数量的slots。Slot是一组固定大小的资源的合集(如计算能力,存储能力)。TaskManagers启动后,会将其所拥有的slots注册到ResourceManager上,由ResourceManager进行统一管理。
  • Dispatcher:负责接收客户端提交的执行程序,并传递给JobManager,除此之外,它还会提供一个WEB UI的界面,用于监控作业的执行情况。
  • ResourceManager:负责管理Slots并协调集群资源,ResourceManager接收来自JobManager的资源请求,并将存在空闲的slots的TaskManagers分配给JobManager执行任务。Flinks基于不同的部署平台,它们会提供不通过的资源管理器,当TaskManagers没有足够的slots来执行时,它会向第三方平台发起会话来请求额外的资源。

2,Task & SubTask
TaskManagers实际执行的是SubTask,而不是Task。在执行分布式计算时,Flink将可以链接的操作(operators)链接到一起,这就是Task。之所以这样做,是为例减少线程间切换和缓冲而导致的开销,在降低延迟的同时提高整体的吞吐量。单身,不是所有的operator都可以被链接,如ByKey等操作会导致shuffle和重分区,因此就不能被链接,只能单独作为一个Task。一个Task就是一个可以连接的最小的操作链。
SubTask:一个Task可以按照其并行度拆分为多个SubTask,JobManager负责定义和拆分这些SubTask,并将其提交给TaskManagers来执行,每个SubTask都是一个单独的线程。

3,组件通信

Flink的所有组件都是基于Actor System来进行通讯,Actor System是有多种角色的actor的容器,它提供调度,配置】日志记录等多种服务,并包含一个可以启动所有actor的线程池。如果actor是本地的,则消息是通过共享内存进行共享,但是如果actor是远程的,则通过RPC的调用来传递消息。

五、Flink On Yarn

Flink On Yarn有两种运行方式:
1,会在yarn上开辟一块资源专门用于运行flink集群,这块资源一直被占用,除非手动停止
2,每次提交任务后,会开辟一个新的flink集群,每次都开辟一个新的,两次运行之间没有任何影响,方便以后的管理。

Flink的入门