[Flink]介绍 | 核心组成 | flink的角色 | 运行架构【旧】

绿色为未确认的部分

一、概述

  1. 什么是Flink

是一种大数据计算引擎,用于对无界(流数据)和有界(批数据)数据进行有状态计算。

  1. 特点

1)批流一体:统一批处理、流处理

2)分布式:Flink程序可以运行在多台电脑上

3)高性能:处理速度很快

4)高可用:Flink支持高可用性(HA)

5)Flink可以保证数据处理的准确性,及时出现问题,也能进行修正

  1. Flink的核心组成

1)Deploy(部署)层

①本地模式:启动单个JVM让Flink以Local模式运行。

②集群模式运行:standalone(flink自己管理自己的资源)、yarn(yarn管理集群资源)

③运行在云服务器

2)Core层:runtime运行时的核心技术

3)API层

在runtime之上提供了两套核心api:DataStream API(流处理)、DataSet API(批处理)。

4)应用框架层(用于满足特定应用)

datastream:CEP(Event Processing复杂事件处理)、Table(Relational关系型数据库处理)

dataset :Table(关系型数据库)、flinkML(机器学习)、Gelly(图计算)

3.flink可以处理哪些数据

绿色:流处理 蓝色:批处理

输入Connectors(左侧部分)

流处理:kafka等

批处理:HDFS、HBase等

输出Connectors(右侧部分)

流处理:kafka、elasticsearch(全文检索)、HDFS rolling file(滚动文件)

批处理:HBase、HDFS

4.Flink的处理模型:流处理与批处理

1)无限流处理:输入的数据像水一样源源不断

2)有限流处理:一次处理一部分数据

5.有状态的流处理:

1)flink在处理有限流和无线流时,都可以保存处理状态。

2)可以将第一个子任务的处理结果形成一个状态,将状态保存起来(可以保存在内存中,也可以持久化大到外部存储系统中)。当前状态保存了其中一个子任务处理的中间结果。

3)优点:在第一个任务的位置挂掉了,程序重新启动时,不在需要把第一个任务和之前任务进行重新计算,可以直接找到第一个子任务的状态,用它快读恢复输出结果。甚至可以是直接把输出结果保存到状态里,直接读取出来即可。

6.流处理引擎的技术选型

  1. 如果需要保证exactly-once或者at least once不能选择strom.且strom不能处理大量数据.

  1. 如果项目已经使用spark框架,并且实时性要求不高,选择spark streaming

  1. 满足exactly once,数据量大,高吞吐,低延迟需求,要进行状态管理和窗口统计,选择flink。

三、Flink的体系结构

1、Flink的重要角色

Flink是经典的Master、Worker结构,jobManager就是Master,TaskManager就是Slave

1)JobManager处理器(Master节点)

①协调分布式执行,他们用来调度task,协调检查点(CheckPoint),协调失败时恢复等。

②Flink运行时至少存在一个JobManager处理器,如果配置高可用则会存在多个JobManager处理器,它们其中有一个是leader,一个是standby。

③jobManager接受的应用包括jar和jobGraph(提交任务后生成的逻辑视图)

2)TaskManager处理器(Worker节点)

①主要职责是从JobManager处接收任务,并部署和启动任务,接收上游的数据并处理。

②TaskManager是在JVM中的一个或多个线程中执行任务的工作节点。

③TaskManager在启动的时候会向ResourceManager注册自己的资源信息(Slot的数量等)。

3)ResourceManager

针对不同的环境和资源提供者(Yarn、Kubernetes或独立部署),Flink提供了不同的ResourceManager。

作用:负责管理Flink的处理资源单元--Slot。

4)Dispatcher(分发器)

①作用:提供一个REST接口(即http的url),来通过这个url把flink应用程序提交到Flink集群。

②一旦一个应用提交执行,Dispatcher会启动一个JobManager,并将应用转交给他。

③Dispatcher还会启动一个webUI来提供有关作业执行信息。

注意:某些应用的提交执行的方式,有可能用不到Dispatcher。

5)各组件之间的关系

1)Applicatiojn(应用):包括jar(程序打成的jar包)和JobGraph(逻辑视图,根据代码所描绘的逻辑生成的)

2)Dispatcher:通过REST接口接收到了应用,立即去通知JobManager

3)JobManager在集群中启动,将应用程序中的JobGraph(逻辑视图)转化成为ExecutorGraph(物理视图,包含每个算子的子任务)

4)JobManager向ResourceManager申请资源,ResourceManager分配完资源后,把资源信息返回给JobManager(3台TaskManager中的6个slot正好够你用)。

slot是TaskManager中真正干活的空间,每个slot占据固定的资源(cpu和内存)

5)JobManager将自己的每个任务发送到TaskManager的slot中去执行。

2、Flink运行架构

1)Flink程序架构

代码所描述的逻辑生成的逻辑视图(jobGraph)

注:operator(操作)

①source数据源

定义Flink从哪里加载数据,Flink在流处理和批处理上的source大概有4类:基于本地集合的source、基于文件的source、基本网络socket的source。自定义的source:图中的env.addSource是自定义的数据源,即从其他组件读取数据:如kafka

②在transformation转换操作,也成为算子

有map、flatMap、Filter、keyBy、Reduce、window等,可以将数据转换成你想要的形式。

③在sink接收器,将结果输出。

Flink常见的sink大概有如下几类:写入文件、写入socket、自定义的sink:图中的addSink是自定义的sink,可以将结果写入kafka、mysql、es、hdfs等。

2)Task和SubTask

①Task是一个阶段多个功能相同的SubTask的集合,类似于Spark的TaskSet。

②SubTask(子任务)是Flink中任务最小执行单元。比如一个map操作,分布式场景下会再多个线程中同时运行,每个线程中执行的都叫做一个SubTask。

3)Operator chain(操作器链)

Flink会进行一个优化:将两个或者多个子任务(subTask)形成一个操作器链。

形成操作器链的子任务有一定的条件:相同的并行度,在本地进行数据传输,不涉及shuffle过程,满足这样的条件,就可以将两个子任务连到一起,形成一个操作器链。

4)Flink中的数据传输

Flink在处理任务间的数据传输过程中依赖了缓冲区机制。

5)任务槽(slot)和槽共享
任务槽

一个TaskManager是一个进程,一个TaskManager中有多个slot,这个进程里的每个slot都是一个线程。任务槽用来执行具体的子任务(subTask)。

槽共享

用同一个slot执行多个subtask(这些subTask一定来自于同一个应用)。

优点:不浪费任务任务槽中的资源。缺点:每个运行在相同slot中的子任务,无法相互独立,一旦有一个subTask执行失败,会将这个slot的线程杀死。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值