在上一篇文章 你公司到底需不须要引入实时计算引擎? 中我讲解了平常中常见的实时需求,而后分析了这些需求的实现方式,接着对比了实时计算和离线计算。随着这些年大数据的飞速发展,也出现了很多计算的框架(Hadoop、Storm、Spark、Flink)。在网上有人将大数据计算引擎的发展分为四个阶段。git
或许会有人不一样意以上的分类,我以为其实这并不重要的,重要的是体会各个框架的差别,以及更适合的场景。并进行理解,没有哪个框架能够完美的支持全部的场景,也就不可能有任何一个框架能彻底取代另外一个。github
本文将对 Flink 的总体架构和 Flink 的多种特性作个详细的介绍!在讲 Flink 以前的话,咱们先来看看 数据集类型 和 数据运算模型 的种类。sql
那么那些常见的无穷数据集有哪些呢?缓存
那么咱们再来看看 Flink 它是什么呢?微信
Flink 是一个针对流数据和批数据的分布式处理引擎,代码主要是由 Java 实现,部分代码是 Scala。它能够处理有界的批量数据集、也能够处理无界的实时数据集。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已,因此 Flink 也是一款真正的流批统一的计算引擎。网络
Flink 提供了 State、Checkpoint、Time、Window 等,它们为 Flink 提供了基石,本篇文章下面会稍做讲解,具体深度分析后面会有专门的文章来说解。session
从下至上:数据结构
一、部署:Flink 支持本地运行(IDE 中直接运行程序)、能在独立集群(Standalone 模式)或者在被 YARN、Mesos、K8s 管理的集群上运行,也能部署在云上。架构
二、运行:Flink 的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理。框架
三、API:DataStream、DataSet、Table、SQL API。
四、扩展库:Flink 还包括用于 CEP(复琐事件处理)、机器学习、图形处理等场景。
Flink 支持多种模式下的运行。
bin/start-cluster.sh
脚本则会启动一个 Standalone 模式的集群 一般上面四种居多,另外还支持 AWS、MapR、Aliyun OSS 等。
Flink 做业提交架构流程可见下图:
一、Program Code:咱们编写的 Flink 应用程序代码
二、Job Client:Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点。 Job Client 负责接受用户的程序代码,而后建立数据流,将数据流提交给 Job Manager 以便进一步执行。 执行完成后,Job Client 将结果返回给用户
三、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 中的一个或多个线程中执行任务的工做节点。 任务执行的并行性由每一个 Task Manager 上可用的任务槽(Slot 个数)决定。 每一个任务表明分配给任务槽的一组资源。 例如,若是 Task Manager 有四个插槽,那么它将为每一个插槽分配 25% 的内存。 能够在任务槽中运行一个或多个线程。 同一插槽中的线程共享相同的 JVM。同一 JVM 中的任务共享 TCP 链接和心跳消息。Task Manager 的一个 Slot 表明一个可用线程,该线程具备固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离。默认状况下,Flink 容许子任务共享 Slot,即便它们是不一样 task 的 subtask,只要它们来自相同的 job。这种共享能够有更好的资源利用率。
Flink 提供了不一样的抽象级别的 API 以开发流式或批处理应用。
一个完整的 Flink 应用程序结构就是如上两图所示:
一、Source:数据输入,Flink 在流处理和批处理上的 source 大概有 4 类:基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,固然你也能够定义本身的 source。
二、Transformation:数据转换的各类操做,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操做不少,能够将数据转换计算成你想要的数据。
三、Sink:数据输出,Flink 将转换计算后的数据发送的地点 ,你可能须要存储下来,Flink 常见的 Sink 大概有以下几类:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也能够定义本身的 sink。
Flink 拥有丰富的库来进行机器学习,图形处理,关系数据处理等。因为其架构,很容易执行复杂的事件处理和警报。
Flink 支持多种 Time,好比 Event time、Ingestion Time、Processing Time,后面的文章 Flink 中 Processing Time、Event Time、Ingestion Time 对比及其使用场景分析 中会很详细的讲解 Flink 中 Time 的概念。
Flink 支持多种 Window,好比 Time Window、Count Window、Session Window,还支持自定义 Window。后面的文章 如何使用 Flink Window 及 Window 基本概念与实现原理 中会很详细的讲解 Flink 中 Window 的概念。
Flink 的程序内在是并行和分布式的,数据流能够被分区成 stream partitions,operators 被划分为 operator subtasks; 这些 subtasks 在不一样的机器或容器中分不一样的线程独立运行;operator subtasks 的数量在具体的 operator 就是并行计算数,程序不一样的 operator 阶段可能有不一样的并行数;以下图所示,source operator 的并行数为 2,但最后的 sink operator 为 1:
Flink 是一款有状态的流处理框架,它提供了丰富的状态访问接口,按照数据的划分方式,能够分为 Keyed State 和 Operator State,在 Keyed State 中又提供了多种数据结构:
另外状态存储也支持多种方式:
Flink 中支持使用 Checkpoint 来提升程序的可靠性,开启了 Checkpoint 以后,Flink 会按照必定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink 会将全部任务的状态恢复至最后一次发生 Checkpoint 中的状态,并从那里开始从新开始执行。
另外 Flink 还支持根据 Savepoint 从已中止做业的运行状态进行恢复,这种方式须要经过命令进行触发。
Flink 在 JVM 中提供了本身的内存管理,使其独立于 Java 的默认垃圾收集器。 它经过使用散列,索引,缓存和排序有效地进行内存管理。咱们在后面的文章 深刻探索 Flink 内存管理机制 会深刻讲解 Flink 里面的内存管理机制。
本篇文章对 Flink 作了一个详细的介绍,将 Flink 的特色一一作了描述,后面文章中咱们也会进一步地对这里面的特色进行原理解析。本文的地址是 www.54tianzhisheng.cn/2019/08/19/… ,未经容许禁止任何形式的转载,违者必究。
GitHub Flink 学习代码地址:github.com/zhisheng17/…
微信公众号:zhisheng
另外我本身整理了些 Flink 的学习资料,目前已经所有放到微信公众号(zhisheng)了,你能够回复关键字:Flink 便可无条件获取到。另外也能够加我微信 你能够加个人微信:yuanblog_tzs,探讨技术!
更多私密资料请加入知识星球!
扫码下面专栏二维码能够订阅该专栏
首发地址:www.54tianzhisheng.cn/2019/11/15/…
一、Flink 从0到1学习 —— Apache Flink 介绍
二、Flink 从0到1学习 —— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门
三、Flink 从0到1学习 —— Flink 配置文件详解
四、Flink 从0到1学习 —— Data Source 介绍
五、Flink 从0到1学习 —— 如何自定义 Data Source ?
六、Flink 从0到1学习 —— Data Sink 介绍
七、Flink 从0到1学习 —— 如何自定义 Data Sink ?
八、Flink 从0到1学习 —— Flink Data transformation(转换)
九、Flink 从0到1学习 —— 介绍 Flink 中的 Stream Windows
十、Flink 从0到1学习 —— Flink 中的几种 Time 详解
十一、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 ElasticSearch
十二、Flink 从0到1学习 —— Flink 项目如何运行?
1三、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Kafka
1四、Flink 从0到1学习 —— Flink JobManager 高可用性配置
1五、Flink 从0到1学习 —— Flink parallelism 和 Slot 介绍
1六、Flink 从0到1学习 —— Flink 读取 Kafka 数据批量写入到 MySQL
1七、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RabbitMQ
1八、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HBase
1九、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 HDFS
20、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Redis
2一、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Cassandra
2二、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 Flume
2三、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 InfluxDB
2四、Flink 从0到1学习 —— Flink 读取 Kafka 数据写入到 RocketMQ
2五、Flink 从0到1学习 —— 你上传的 jar 包藏到哪里去了
2六、Flink 从0到1学习 —— 你的 Flink job 日志跑到哪里去了
2八、Flink 从0到1学习 —— Flink 中如何管理配置?
2九、Flink 从0到1学习—— Flink 不能够连续 Split(分流)?
30、Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
3二、为何说流处理即将来?
3三、OPPO 数据中台之基石:基于 Flink SQL 构建实时数据仓库
3六、Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
3八、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了
40、Flink 全网最全资源(视频、博客、PPT、入门、原理、实战、性能调优、源码解析、问答等持续更新)
4二、Flink 从0到1学习 —— 如何使用 Side Output 来分流?
四、Flink 源码解析 —— standalone session 模式启动流程
五、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
六、Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
七、Flink 源码解析 —— 分析 Batch WordCount 程序的执行过程
八、Flink 源码解析 —— 分析 Streaming WordCount 程序的执行过程
九、Flink 源码解析 —— 如何获取 JobGraph?
十、Flink 源码解析 —— 如何获取 StreamGraph?
十一、Flink 源码解析 —— Flink JobManager 有什么做用?
十二、Flink 源码解析 —— Flink TaskManager 有什么做用?
1三、Flink 源码解析 —— JobManager 处理 SubmitJob 的过程
1四、Flink 源码解析 —— TaskManager 处理 SubmitJob 的过程
1五、Flink 源码解析 —— 深度解析 Flink Checkpoint 机制
1六、Flink 源码解析 —— 深度解析 Flink 序列化机制
1七、Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
1八、Flink Metrics 源码解析 —— Flink-metrics-core
1九、Flink Metrics 源码解析 —— Flink-metrics-datadog
20、Flink Metrics 源码解析 —— Flink-metrics-dropwizard
2一、Flink Metrics 源码解析 —— Flink-metrics-graphite
2二、Flink Metrics 源码解析 —— Flink-metrics-influxdb
2三、Flink Metrics 源码解析 —— Flink-metrics-jmx
2四、Flink Metrics 源码解析 —— Flink-metrics-slf4j
2五、Flink Metrics 源码解析 —— Flink-metrics-statsd
2六、Flink Metrics 源码解析 —— Flink-metrics-prometheus
2七、Flink 源码解析 —— 如何获取 ExecutionGraph ?
30、Flink Clients 源码解析原文出处:zhisheng的博客,欢迎关注个人公众号:zhisheng