当前位置:   article > 正文

Apache Flink简介_apache flink 概述

apache flink 概述

Flink作为实时流处理界的新秀,以其优越的性能被越来越多的公司使用。

1、Flink简介

Apache Flink是新一代的大数据处理引擎,目标是统一不同来源的数据处理。同时,Flink也是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能,Flink本身提供了DataSet和DataStream两种API供用户进行批/流处理统一,除此之外另一个受用户瞩目的功能是Flink同时支持Scala和Java两种编程语言。

目前常用的批处理解决方案有:MapReduce、Spark Streaming(mini batch ,严格意义上来说仍属于批处理),常用的流处理解决方案:storm。Flink在实现流处理和批处理时,与传统的一些方案完全不同,它将流处理和批处理二者统一起来:Flink是完全支持流处理,就是说作为流处理看待时输入数据流是无界的,也就是我们常说的无界流;批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的,也就是我们常说的有界流。所以说这个功能在目前来说是许多公司需要的,当作为一个系统为公司使用时,我们更偏向于使用同一种大数据生态,例如公司之前使用了Spark,但是现在有需求要做流处理,我们可能会考虑Storm,但是在数据实时要求不是那么高的情况下,则更会偏向于Spark Streaming,毕竟是属于同一个生态圈。

2、Flink的编程模型

Flink以层级式系统形式组件其软件栈,不同层的栈建立在其下层基础上,并且各层接受程序不同层的抽象形式。从部署上讲,Flink支持local模式、集群模式(standalone集群或者Yarn集群)、云端部署。Runtime是主要的数据处理引擎,它以JobGraph形式的API接收程序,JobGraph是一个简单的并行数据流,包含一系列的tasks,每个task包含了输入和输出(source和sink例外),个人认为可以理解成DAG。Flink的核心是DistributedStreaming Dataflow引擎,它用来执行dataflow程序。Flink的核心运行引擎可以看作是Streaming Dataflow引擎,DataSetAPI和DataStreamAPI都可以通过该引擎创建运行时程序。

DataStream API和DataSet API是流处理和批处理的应用程序接口,当程序在编译时,生成JobGraph。编译完成后,根据API的不同,优化器(批或流)会生成不同的执行计划。根据部署方式的不同,优化后的JobGraph被提交给了executors去执行。

3、Flink的执行流

根据上图,我们来简单的顺一遍Flink的程序执行流程:首先,Flink程序代码以graph的形式提交给JobClient,JobClient再提交到JobManager,JobManager负责资源的协调和Job的执行。一旦资源分配完成,task就会分配到不同的TaskManager,TaskManager会初始化线程去执行task,并根据程序的执行状态向JobManager反馈,执行的状态包括starting、in progress、finished以及canceled和failing等。当Job执行完成,结果会返回给客户端。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

Flink分布式程序包含2个主要的进程:JobManager和TaskManager,这个看起来有点像第一代Hadoop中的JobTracker和TaskTracker,其实他们物理状态的作用都是类似的,毕竟分布式结构都是主从模式。当程序运行时,不同的进程就会参与其中,包括Jobmanager、TaskManager和JobClient。

  • JobClient是程序执行的入口。Job Client负责接收用户提交的程序,并将用户提交的程序通过优化器和GraphBuilder转换成Dataflow graph。然后将生成的Data flow提交给Job Manager。等待计算任务执行完成,Job Client将返回给用户执行结果。

  • JobManager:也叫做Master进程,负责Job的管理和资源的协调。包括任务调度,监控任务的执行状态,协调任务的执行,检查点(Check point)管理,失败恢复等。

  • TaskManager:是具体执行tasks的worker节点,执行任务运行在一个JVM中的一个或多个线程中。TaskManager就是运行在不同节点上的JVM进程,这个进程会拥有一定的量的资源。比如内存,CPU,网络,磁盘等等。可以将进程的内存划分到多个slot上去。每个TaskSlot包括JVM进程中的一部分内存。

  • TaskSlot:是分布式程序真正执行Task的地方。通过调整TaskSlot的数量,用户可以定义子任务是如何相互隔离的。假如每个TaskManager有一个TaskSlot,意味着每个task在单独的JVM中运行(例如,可以在单独的容器中启动)。TaskManager拥有多个TaskSlot意味着更多的子任务共享相同的JVM内存。相同JVM中的任务共享TCP连接(通过多路复用)和心跳消息。它们还可以共享数据集和数据结构,从而减少了每个任务的开销。

4、Flink特性

  1. 支持高吞吐、低延迟、高性能的流处理
  2. 支持带有事件时间的窗口(Window)操作:Flink支持数据驱动的窗口,这意味着我们可以基于时间(event time或processing time)、count和session来构建窗口;窗口同时可以定制化,通过特定的pattern实现。
  3. 支持有状态计算的Exactly-once语义:通过检查点+可重发的数据源,使得Flink对于stateful的operator,支持exactly once的计算。当然你可以选择降级到at least once。
  4. 支持高度灵活的窗口(Window)操作:Flink支持数据驱动的窗口,这意味着我们可以基于时间(event time或processing time)、count和session来构建窗口;窗口同时可以定制化,通过特定的pattern实现。
  5. 内存管理:Flink在JVM内部进行内存的自我管理,使得其独立于java本身的垃圾回收机制。当处理hash、index、caching和sorting时,Flink自我的内存管理方式使得这些操作很高效。但是,目前自我的内存管理只在批处理中实现,流处理程序并未使用。
  6. 容错机制:基于轻量级分布式快照(Snapshot)实现的容错。
  7. 程序自动优化:为了避免shuffle、sort等操作,Flink的批处理API进行了优化,它可以确保避免过度的磁盘IO而尽可能使用缓存。
  8. 流和批的统一:Flink中批和流有各自的API,用户既可以开发批程序,也可以开发流处理程序。事实上,Flink中的流处理优先原则,认为批处理是流处理的一种特殊情况mini batch。
  9. Event Time语义:Flink支持Event Time语义的处理,这有助于处理流计算中的乱序问题,有些数据也许会迟到,我们可以通过基于event time、count、session的窗口来处于这样的场景。

以上这些特性,对于流式数据处理的最终结果准确性有重要意义。

5、Flink支持

  1. Libraries支持:支持机器学习,提供FlinkML;
  2. 整合支持:整合常用的大数据生态组件,包括Flink on YARN、HDFS、HBase、Kafka、ElasticSearch,此外还整合支持了storm,可将storm的流处理程序移植到Flink上。

6、为什么选择Flink?

首先,我们都知道它是一个开源的分布式流式处理框架:①提供准确的结果,甚至在出现无序或者延迟加载的数据的情况下。②它是状态化的容错的,同时在维护一次完整的的应用状态时,能无缝修复错误。③大规模运行,在上千个节点运行时有很好的吞吐量和低延迟

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/772727
推荐阅读
相关标签
  

闽ICP备14008679号