Flink简介/运行框架/流与批/分层API

Flink


  Flink起源于Stratosphere项目
Flink项目的理念是:"Apache Flink是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架"
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink呗设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算

Flink的重要特点


  时间驱动型(Event-driven)
  时间驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算,状态更新或其他外部动作。比较典型的就是以kafka为代表的消息队列几乎都是时间驱动型应用

  
流与批的世界观


  批处理的特点是:有界,持久,大量,非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计
  流处理的特点是:无界,实时,无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计


 在spark的世界观中:一切都是由批次组成的,离线数据是一个大批次,而实时数据是由一个一个无限的小批次组成的。
 而在flink的世界观中:一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,这就是所谓的有界流和无界流


  无界数据流:无界数据流有一个开始但是没有结束,它们不会再生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理event。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取event,以便能够推断结果完整性。


  有界数据流:有界数据流有明确定义的开始和结束,可以在执行任何计算之前通过获取所有数据来处理有界流,处理有界流不需要有序获取,因为可以始终对有界数据集进行排序,有界流的处理也称为批处理。


  这种以流为世界观的架构,获取的最大好处就是具有极低的延迟。

分层API

Flink简介/运行框架/流与批/分层API_第1张图片


  最底层的抽象仅仅提供有状态流,它通过过程函数(Process Function)嵌入DataStream API中。底层过程函数(Process Function)与DataStream API相集成,使其可以对某些特定的操作进行底层的抽象,它允许用户可以自由的处理来自一个或多个数据流的事件,并使用一致的容错的状态。除此之外,用户可以注册事件时间并处理时间回调,从而使程序可以处理复杂的计算。

实际上,大多数应用并不需要上述的底层抽象,而是针对核心API(Core APIs)进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)。这些API为数据处理提供了通用的构建模块,比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows)等等。DataSet API为有界数据集提供了额外的支持,例如循环与迭代。这些API处理的数据类型以类(classes)的形式由各自的编程语言所表示。

Table API以表为中心声明式编程,其中表可能会动态变化(在表达流数据时),Table API遵循(扩展的)关系模型:表有二位数据结构(schema)(类似于关系数据库中的表),同时 API程序声明式地定义了什么逻辑操作应该执行,而不是准确地确定这些操作代码的看上去如何

尽管Table API可以通过多种类型的用户自定义函数(UDF)进行扩展,其仍不如核心API更具表达能力,但是使用起来却更加简洁(代码量更少)。除此之外,Table API程序在执行之前会经过内置优化器进行优化。

你可以在表与DataStream/DataSet之间无缝切换,以允许程序将Table API与DataStream以及DataSet混合使用。

  Flink作为批处理还不是主流,不如Spark成熟,所以DataSet使用的并不是很多。Flink Table API和Flink SQL也并不完善,大多都由各大厂商自己定制。所以以我们主要掌握DataStream API的使用。实际上Flink作为最接近Google DataFlow模型的实线,是流批统一的观点。所以基本上使用DataStream就可以了
  Flink几大模块
  Flink Table & SQL(还未开发完成) //例如hive中常用的row_number() over()无法使用
  Flink Gelly(图计算)
  Flink CEP(复杂事件处理)


Flink运行架构


Flink运行时的组件

Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),以及分发器(Dispatcher).因为Flink是用java和Scala实现的,所以所有组件都会运行在Java虚拟机上。每个组件的职责如下


作业管理器(JobManager)

控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行JobManager会先接受到要执行的应用程序,这个应用程序会包括:作业图(JobGraph),逻辑数据流图(Lohical dataflow graph)和打包了所有的类、库和其它资源的JAR包。JobManager会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。


  资源管理器(ResourceManager)

主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger插槽是Flink中定义的处理资源单元。Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。另外,ResourceManager还负责终止空闲的TaskManager,释放计算资源。


  任务管理器(TaskManager)

  Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)//不可能为零。插槽的数量限制了TaskManager能够执行的任务数量。启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。


  分发器(Dispatcher)

 可以跨作业运行,它为应用提交提供了REST接口。当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。由于是REST接口,所以Dispatcher可以作为集群的一个HTTP接入点,这样就能够不受防火墙阻挡。Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

你可能感兴趣的:(入门,flink)