赞
踩
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,毕竟是属于同一个生态圈。
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去执行。
根据上图,我们来简单的顺一遍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连接(通过多路复用)和心跳消息。它们还可以共享数据集和数据结构,从而减少了每个任务的开销。
以上这些特性,对于流式数据处理的最终结果准确性有重要意义。
首先,我们都知道它是一个开源的分布式流式处理框架:①提供准确的结果,甚至在出现无序或者延迟加载的数据的情况下。②它是状态化的容错的,同时在维护一次完整的的应用状态时,能无缝修复错误。③大规模运行,在上千个节点运行时有很好的吞吐量和低延迟
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。