Flink架构原理

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 笔记

(1)Flink应用场景


实际生产的场景,如金融交易数据、互联网订单数据、GPS定位数据、传感器信号、启动终端生产的数据、通讯信号数据等,以及我们熟悉的网络流量监控、服务器产生的日志数据,这些数据最大的共同点就是实时从不同的数据源产生,然后在传输到下游的分析系统。针对这些数据类型主要包括:


实时智能推算

智能推算会根据用户历史的购买行为,通过推荐算法训练模型,预测用户未来可能会购买的物品。


复杂事件处理

对于复杂事件处理,比较常见的案例主要集中在工业领域,例如对车载传感器、机械设备等实时检测,这些业务类型通常数据量都非常大,且对数据处理的时效性要求非常高。通过利用Flink提供的CEP (复杂事件处理)进行事情模式的抽取,同时应用Flink的SQL进行事件数据的转换,在流式系统构建实时规则引擎,一旦事件触发报警规则,便立即将告警结果传输至下游通知系统,从而实现对设备故障快速预警监测,车辆状态监控等。


实时欺诈检测

在金融领域的业务中,尝尝出现各种类型的欺诈行为,例如信用卡欺诈、信贷申请欺诈等。我们可以运用Flink流式计算能够在毫秒内就完成对欺诈判断行为指标的计算,然后实时对交易流水进行规则判断或者模型预测,这样一旦检测出交易存在欺诈嫌疑,则直接对交易进行实时拦截。


实时数据仓库与ETL

结合离线数据仓库,通过利用流计算的优势,补充和优化离线数据仓库。通过有状态的流式计算,高效快速的处理企业需要的统计结果。


流数据分析

实时计算各类数据指标,并利用实时结果及时调整在线系统相关策略,在各类内容投放、无线智能推送领域有大量的应用。


(2)Flink组件架构


1.png

API&Libraries层


作为分布式数据处理框架,Flink同时提供了支撑流计算和批计算的接口,同时在此基础上抽象出不同的应用类型的组件库,如基于流处理的CEP (复杂事件处理库)、SQL&Table库和基于批处理的FlinkML (机器学习库)、Gelly (图形处理库)。API层包括构建流计算应用的DataStream API和批计算应用的DataSet API,两者都提供给用户丰富的数据处理高级API,例如Map、FlatMap操作等,同时也提供比较低级的ProcessFunction API,用户可以直接操作状态和时间等底层数据。


核心层

该层主要负责对上层不同接口提供基础服务,也是F1ink分布式计算框架的核心实现层,支持分布式 Stream作业的执行、JobGraphExecutionGraph到的映射转换、任务调度等。将DataStreamDataSet和转成统一的可执行的 Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。


物理部署层

目前Flink支持多种模式:本地、集群(Standalone/YARN)、云(GCE谷歌/EC2亚马逊)、Kubenetes。


(3)Flink系统架构


Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManager。 Flink框架也遵循Master 一 Slave加过设计原则,JobManager为Master节点,TaskManager为Work (salve)节点。所有组件之间的通讯都是借助于Akka框架,包括任务的状态以及Checkpoint触发信息。

2.png


(3.1)Client客户端

Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。客户端可以作为触发执行 Java/Scala 程序的一部分运行,也可以在命令行进程./bin/flink run …中运行。


可以通过多种方式启动 JobManager 和 TaskManager:直接在机器上作为standalone 集群启动、在容器中启动、或者通过YARN或Mesos等资源框架管理并启动。TaskManager 连接到 JobManagers,宣布自己可用,并被分配工作。


客户端负责将任务提交到集群,与 JobManager构建Akka连接,然后任务提交到 JobManager,通过和 JobManager之间进行交互获取任务执行状态。客户端提交任务可以采用CLI方式或者 Flink通过使用 WebuI提交,也可以在应用程序中指定 JobManager的RPC网络端 ExecutionEnvironmentFlink口构建提交应用。


(3.2)JobManager

JobManager负责整个Flink集群任务的调度以及资源管理,从客户端中获取提交的应用,然后根据集群中TaskManager上TaskSlot的使用情况,为提交的应用分配相应的TaskSlots资源并命令TaskManager启动从客户端中获取的应用。JobManager相当于整个集群的Master节点,且整个集群中有且仅有一个活跃的JobManager,负责整个集群的任务管理和资源管理。JobManager和TaskManager之间通过Actor System进行通信,获取任务执行的情况并通过Actor System将应用的任务执行情况发送给客户端。同时在任务执行过程中,Flink JobManager会触发Checkpoint操作,每个TaskManager节点收到Checkpoint触发指令后,完成Checkpoint操作,所有的Checkpoint协调过程都是在Flink JobManager中完成。当任务完成后,Flink会将任务执行的信息反馈给客户端,并释放掉TaskManager中的资源供下次提交任务的使用。


JobManager 具有许多与协调 Flink 应用程序的分布式执行有关的职责:它决定何时调度下一个 task(或一组 task)、对完成的 task 或执行失败做出反应、协调 checkpoint、并且协调从失败中恢复等等。这个进程由三个不同的组件组成:


ResourceManager

ResourceManager 负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots,这是 Flink 集群中资源调度的单位(请参考TaskManagers)。Flink 为不同的环境和资源提供者(例如 YARN、Mesos、Kubernetes 和 standalone 部署)实现了对应的 ResourceManager。在 standalone 设置中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行启动新的 TaskManager。


Dispatcher

Dispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。


JobMaster

JobMaster 负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。


始终至少有一个 JobManager。高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby(请参考 高可用(HA))。


(3.3)TaskManager

TaskManager相当于整个集群的Slave节点,负责具体的任务执行和对应任务在每个节点上的资源申请与管理。客户端通过将编写好的Flink应用编译打包,提交到JobManager,然后JobManager会根据已经注册在JobManager中的TaskManager的资源情况,将任务分配给有资源的TaskManager节点,然后启动并运行任务。TaskManager从JobManager接受需要部署的任务,然后使用Slot资源启动Task,建立数据接入的网路连接,接受数据并开始数据处理。同时TaskManager之间的数据交互都是通过数据流的方式进行的。


TaskManager(也称为 worker)执行作业流的 task,并且缓存和交换数据流。


必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子(请参考Tasks 和算子链)。


(4)Tasks 和算子链


对于分布式执行,Flink 将算子的 subtasks 链接成 tasks。每个 task 由一个线程执行。将算子链接成 task 是个有用的优化:它减少线程间切换、缓冲的开销,并且减少延迟的同时增加整体吞吐量。链行为是可以配置的;


下图中样例数据流用 5 个 subtask 执行,因此有 5 个并行线程。

3.png


(5)Task Slots 和资源


每个 worker(TaskManager)都是一个 JVM 进程,可以在单独的线程中执行一个或多个 subtask。为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)。


每个 task slot 代表 TaskManager 中资源的固定子集。例如,具有 3 个 slot 的 TaskManager,会将其托管内存 1/3 用于每个 slot。分配资源意味着 subtask 不会与其他作业的 subtask 竞争托管内存,而是具有一定数量的保留托管内存。注意此处不涉及 CPU ;当前 slot 仅分离 task 的托管内存。


通过调整 task slot 的数量,用户可以定义 subtask 如何互相隔离。每个 TaskManager 有一个 slot,这意味着每个 task 组都在单独的 JVM 中运行(例如,可以在单独的容器中启动)。具有多个 slot 意味着更多 subtask 共享同一 JVM。同一 JVM 中的 task 共享 TCP 连接(通过多路复用)和心跳信息。它们还可以共享数据集和数据结构,从而减少了每个 task 的开销。

4.png

默认情况下,Flink 允许 subtask 共享 slot,即便它们是不同的 task 的 subtask,只要是来自于同一作业即可。结果就是一个 slot 可以持有整个作业管道。允许 slot 共享有两个主要优点:


Flink集群中的任务所需Slot数可以与任务设置的并行度相同。

提高资源利用率。通过slot共享,我们示例中的基本并行度从2增加到6,充分利用slot资源,同时确保Sub Task在TaskManager之间公平分配。

5.png

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
4天前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
40 0
|
4天前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色?。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信?。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用?。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
2天前
|
SQL Prometheus Kubernetes
实时计算 Flink版产品使用合集之时间戳读取的原理是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
9 0
|
4天前
|
运维 监控 安全
WLAN的组网架构和工作原理
WLAN的组网架构和工作原理
9 0
|
4天前
|
存储 移动开发 前端开发
【Uniapp 专栏】Uniapp 架构设计与原理探究
【5月更文挑战第12天】Uniapp是一款用于跨平台移动应用开发的框架,以其高效性和灵活性脱颖而出。它基于HTML、CSS和Vue.js构建视图层,JavaScript处理逻辑层,管理数据层,实现统一编码并支持原生插件扩展。通过抽象平台特性,开发者能专注于业务逻辑,提高开发效率。尽管存在兼容性和复杂性挑战,但深入理解其架构设计与原理将助力开发者创建高质量的跨平台应用。随着技术进步,Uniapp将继续在移动开发领域扮演重要角色。
【Uniapp 专栏】Uniapp 架构设计与原理探究
|
4天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
4天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
4天前
|
存储 NoSQL 分布式数据库
【Flink】Flink分布式快照的原理是什么?
【4月更文挑战第21天】【Flink】Flink分布式快照的原理是什么?
|
4天前
|
机器学习/深度学习 语音技术 网络架构
【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
|
4天前
|
Java API 微服务
Java微服务架构:原理与实践
【4月更文挑战第15天】本文介绍了Java微服务架构的原理和实践,包括服务拆分、注册与发现、API网关、配置中心和分布式链路追踪。重点提及Spring Boot和Spring Cloud作为开发工具,以及Docker和Kubernetes用于容器化和集群管理。Java微服务架构旨在应对大规模、复杂业务系统的挑战,提升系统可用性和可扩展性。
http://www.vxiaotou.com