赞
踩
Apache Flink 官网 https://flink.apache.org/
Apache Flink GitHub地址 https://github.com/apache/flink
Apache Flink 官方文档地址-1.15 https://nightlies.apache.org/flink/flink-docs-release-1.15/
Apache Flink 是一个开源分布式处理引擎和框架,具有强大的流和批处理功能,用于对无界和有界数据流进行有状态的计算;Flink 能在所有常见的集群环境中运行,并能以内存速度和任意规模进行计算。最新版本1.15.1
截止至今大数据计算框架引擎大致经历以下四代:
流数据更真实地反映了我们的生活方式
传统的数据架构是基于有限数据集
流批计算融合
基于事件进行纯实时计算(连续事件),支持事件时间(event-time)和处理时间(processing-time)语义。
支持高吞吐、低延迟、高性能的流处理,每秒要处理数百万个事件,保证毫秒级延迟
支持带有事件时间的窗口 (Window) 操作
支持有状态计算的 Exactly-once 语义,精确一次(exactly-once)的状态保持一致性。
支持高度灵活的窗口 (Window) 操作,支持基于 time、count、session 以及 data-driven 的窗口操作
支持具有 Backpressure 功能的持续流模型
支持基于轻量级分布式快照(Snapshot)实现的容错
一个运行时同时支持 Batch on Streaming 处理和 Streaming 处理
Flink 在 JVM 内部实现了自己的内存管理
支持迭代计算
动态扩展,高可用,保障7*24高可用。
支持程序自动优化:避免特定情况下 Shuffle、排序等昂贵操作,中间结果有必要进行缓存
基于流的世界观:在 Flink 的世界观中,一切都是由流组成的,离线数据是有界的流;实时数据是一个没有界限的流:这就是所谓的有界流和无界流。
运行任意规模的应用:Flink通常把应用程序并行化数千个任务,这些任务分布在集群中并发执行。因此应用程序能够充分利用无尽的CPU、内存、磁盘和网络IO。Flink能够很方便的对应用程序的状态进行维护。其异步和增量的检查点算法仅仅会对数据延迟产生极小的影响。而且能够保证精确一次状态的一致性。
利用内存进行计算:有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。Flink 通过定期和异步地对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。
Flink常见应用场景如下:
Event-driven Applications(事件驱动应用):事件可以理解为消息,事件驱动的应用程序是一种状态应用程序,它会从一个或者多个流中注入事件,通过触发计算更新状态,或外部动作对注入的事件作出响应。典型事件驱动型应用包括:
下图为传统的事务应用和事件驱动应用的对比
Flink支持流以及批处理分析应用程序,如下图所示:
Data Pipelines & ETL:提取转换加载(ETL)是在存储系统之间转换和移动数据的常用方法。通常会定期触发ETL作业,以将数据从事务数据库系统复制到分析数据库或数据仓库。数据管道的用途和ETL作业类似,它们可以转换和丰富数据,并且可以将其从一个存储系统转移到另一个存储系统,但是它们以连续模式运行,不是定期触发。因此它们能够从连续产生数据的源中读取记录,并以低延迟将其移动到目的地。例如数据管道可能会监视文件系统目录中是否有新文件,并将其数据写入事件日志,另一个应用程序可以将事件流具体化到数据库中,或者以增量方式构建和完善搜索索引。与周期性ETL作业相比,连续数据管道的明显优势是减少了将数据移至其目的地的等待时间。此外,数据管道更通用,可以用于更多用例,因为它们能够连续使用和发出数据。典型数据管道和ETL应用:
下图描述了定期ETL作业和连续数据管道之间的区别
Flink也常用于离线和实时的数据仓库,下图为数仓架构的演变:
离线数据仓库架构图如下:
Lambda架构实时与离线计算融于一体
Kappa架构为Lambda架构简化版本,去掉其离线部分,Flink认为批次也是实时的特例
Flink是一个分布式系统,需要有效地分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,如Hadoop YARN和Kubernetes,但也可以设置为作为一个独立的集群甚至作为一个库运行。一个Flink Cluster=运行时由两类进程组成总是由一个JobManager和一个或多个Flink taskmanager组成。JobManager负责Job提交的处理,Job的监督以及资源的管理。Flink任务管理器是工作进程,负责执行构成Flink作业的实际任务。可以通过客户端提交Flink作业执行各种操作任务。
Program Code:我们编写的 Flink 应用程序代码。
Job Client:Job Client 不是 Flink 运行时和程序执行的内部部分,但它是任务执行的起点。 Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 Job Manager 以便进一步执行。 执行完成后,Job Client 将结果返回给用户。Client用于准备数据流并向JobManager发送数据流。之后,客户端可以断开连接(分离模式),或者保持连接来接收进度报告(附加模式);客户机要么作为触发执行的Java/Scala程序的一部分运行,要么在命令行进程中运行。
Job Manager:主进程(也称为作业管理器)协调和管理程序的执行。 它的主要职责包括安排任务,管理 checkpoint ,故障恢复等。机器集群中至少要有一个 master,master 负责调度 task,协调 checkpoints 和容灾,高可用设置的话可以有多个 master,但要保证一个是 leader, 其他是 standby; Job Manager 包含 Actor system、Scheduler、Check pointing 三个重要的组件。
Task Manager:从 Job Manager 处接收需要部署的 Task。Task Manager 是在 JVM 中的一个或多个线程中执行任务的工作节点。
JobManager和taskmanager可以以各种方式启动:直接在机器上作为独立的集群启动,在容器中启动,或者由像YARN这样的资源框架管理。TaskManagers连接到JobManagers,宣布自己可用,并被分配工作。
任何数据都可以形成一种事件流。银行卡(信用卡)交易、传感器测量、机器日志、网站或移动应用程序上的用户交易记录等等,所有这些数据都能形成一种流。流是数据的自然栖息地,无论是来自网络服务器的事件,股票交易所的交易,还是来自工厂车间机器的传感器读数,数据都是作为流的一部分创建的。但是分析数据时可以围绕有界流或无界流组织处理,也即是数据可以被作为无界和有界流来处理。
Flink擅长处理无界和有界数据集 精确的时间控制和状态化使得Flink的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理。
流可以在两个操作符之间以一对一(或转发)的模式传输数据,也可以采用重分发模式:
Flink能够通过状态快照和流重放的组合提供容错、恰好一次的语义。这些快照捕获分布式管道的整个状态,将偏移量记录到输入队列中,以及在整个作业图中由于吸收了该点之前的数据而产生的状态。当发生故障时,重新绕线源,恢复状态,恢复处理;状态快照是异步捕获的,不会妨碍正在进行的处理。
Flink为开发流/批处理应用程序提供了不同级别的抽象:越顶层越抽象,表达含义越简明,使用越方便;越底层越具体,表达能力越丰富,使用越灵活。
Flink作业提交模式又可分为:
Flink Job部署方式包括session(会话)模式、Per-Job(分离)模式和Application(应用)模式;而Flink on Yarn都支持这三种部署方式:
上图为 Flink 的提交高层级抽象流程,随着部署模式、资源管理平台的不同,会有不同,具体步骤如下:
如果部署模式不同,或者集群环境不同(例如 Standalone、YARN、K8S 等),其中一些步 骤可能会不同或被省略,也可能有些组件会运行在同一个 JVM 进程中。比如独立集群环境的会话模式,就是需要先启动集群,如果资源不够,只能等待资源释放, 而不会直接启动新的 TaskManager。
在会话模式下,我们需要先启动一个YARN session,这个会话会创建一个 Flink 集群。 这里只启动了 JobManager,而 TaskManager 可以根据需要动态地启动。在 JobManager 内部由于还没有提交作业,所以只有 ResourceManager 和 Dispatcher 在运行,如图所示。
接下来就是真正提交作业的流程,如图所示:
**本人博客网站 **IT小神 www.itxiaoshen.com
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。