一文让你完全了解大数据实时计算引擎 Flink

前言

在上一篇文章 你公司到底需不须要引入实时计算引擎? 中我讲解了平常中常见的实时需求,而后分析了这些需求的实现方式,接着对比了实时计算和离线计算。随着这些年大数据的飞速发展,也出现了很多计算的框架(Hadoop、Storm、Spark、Flink)。在网上有人将大数据计算引擎的发展分为四个阶段。git

  • 第一代:Hadoop 承载的 MapReduce
  • 第二代:支持 DAG(有向无环图)框架的计算引擎 Tez 和 Oozie,主要仍是批处理任务
  • 第三代:支持 Job 内部的 DAG(有向无环图),以 Spark 为表明
  • 第四代:大数据统一计算引擎,包括流处理、批处理、AI、Machine Learning、图计算等,以 Flink 为表明

或许会有人不一样意以上的分类,我以为其实这并不重要的,重要的是体会各个框架的差别,以及更适合的场景。并进行理解,没有哪个框架能够完美的支持全部的场景,也就不可能有任何一个框架能彻底取代另外一个。github

本文将对 Flink 的总体架构和 Flink 的多种特性作个详细的介绍!在讲 Flink 以前的话,咱们先来看看 数据集类型数据运算模型 的种类。sql

数据集类型

  • 无穷数据集:无穷的持续集成的数据集合
  • 有界数据集:有限不会改变的数据集合

那么那些常见的无穷数据集有哪些呢?缓存

  • 用户与客户端的实时交互数据
  • 应用实时产生的日志
  • 金融市场的实时交易记录

数据运算模型

  • 流式:只要数据一直在产生,计算就持续地进行
  • 批处理:在预先定义的时间内运行计算,当计算完成时释放计算机资源

那么咱们再来看看 Flink 它是什么呢?微信

Flink 是什么?

Flink 是一个针对流数据和批数据的分布式处理引擎,代码主要是由 Java 实现,部分代码是 Scala。它能够处理有界的批量数据集、也能够处理无界的实时数据集。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已,因此 Flink 也是一款真正的流批统一的计算引擎。网络

Flink 提供了 State、Checkpoint、Time、Window 等,它们为 Flink 提供了基石,本篇文章下面会稍做讲解,具体深度分析后面会有专门的文章来说解。session

Flink 总体结构

从下至上:数据结构

一、部署:Flink 支持本地运行(IDE 中直接运行程序)、能在独立集群(Standalone 模式)或者在被 YARN、Mesos、K8s 管理的集群上运行,也能部署在云上。架构

二、运行:Flink 的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理。框架

三、API:DataStream、DataSet、Table、SQL API。

四、扩展库:Flink 还包括用于 CEP(复琐事件处理)、机器学习、图形处理等场景。

Flink 支持多种方式部署

Flink 支持多种模式下的运行。

  • Local:直接在 IDE 中运行 Flink Job 时则会在本地启动一个 mini Flink 集群
  • Standalone:在 Flink 目录下执行 bin/start-cluster.sh 脚本则会启动一个 Standalone 模式的集群
  • YARN:YARN 是 Hadoop 集群的资源管理系统,它能够在群集上运行各类分布式应用程序,Flink 可与其余应用并行于 YARN 中,Flink on YARN 的架构以下:

  • Kubernetes:Kubernetes 是 Google 开源的容器集群管理系统,在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提升了大规模容器集群管理的便捷性,Flink 也支持部署在 Kubernetes 上,在 GitHub 看到有下面这种运行架构的。

一般上面四种居多,另外还支持 AWS、MapR、Aliyun OSS 等。

Flink 分布式运行

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 提供了不一样的抽象级别的 API 以开发流式或批处理应用。

  • 最底层提供了有状态流。它将经过 Process Function 嵌入到 DataStream API 中。它容许用户能够自由地处理来自一个或多个流数据的事件,并使用一致性、容错的状态。除此以外,用户能够注册事件时间和处理事件回调,从而使程序能够实现复杂的计算。
  • DataStream / DataSet API 是 Flink 提供的核心 API ,DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户能够经过各类方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)将数据进行转换或者计算。
  • Table API 是以表为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操做,使用起来却更加简洁(代码量更少)。
    你能够在表与 DataStream/DataSet 之间无缝切换,也容许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
  • Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 相似,可是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询能够直接在 Table API 定义的表上执行。

Flink 程序与数据流结构

一个完整的 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 拥有丰富的库来进行机器学习,图形处理,关系数据处理等。因为其架构,很容易执行复杂的事件处理和警报。

Flink 提供多种 Time 语义

Flink 支持多种 Time,好比 Event time、Ingestion Time、Processing Time,后面的文章 Flink 中 Processing Time、Event Time、Ingestion Time 对比及其使用场景分析 中会很详细的讲解 Flink 中 Time 的概念。

Flink 提供灵活的窗口机制

Flink 支持多种 Window,好比 Time Window、Count Window、Session Window,还支持自定义 Window。后面的文章 如何使用 Flink Window 及 Window 基本概念与实现原理 中会很详细的讲解 Flink 中 Window 的概念。

Flink 并行的执行任务

Flink 的程序内在是并行和分布式的,数据流能够被分区成 stream partitions,operators 被划分为 operator subtasks; 这些 subtasks 在不一样的机器或容器中分不一样的线程独立运行;operator subtasks 的数量在具体的 operator 就是并行计算数,程序不一样的 operator 阶段可能有不一样的并行数;以下图所示,source operator 的并行数为 2,但最后的 sink operator 为 1:

Flink 支持状态存储

Flink 是一款有状态的流处理框架,它提供了丰富的状态访问接口,按照数据的划分方式,能够分为 Keyed State 和 Operator State,在 Keyed State 中又提供了多种数据结构:

  • ValueState
  • MapState
  • ListState
  • ReducingState
  • AggregatingState

另外状态存储也支持多种方式:

  • MemoryStateBackend:存储在内存中
  • FsStateBackend:存储在文件中
  • RocksDBStateBackend:存储在 RocksDB 中

Flink 支持容错机制

Flink 中支持使用 Checkpoint 来提升程序的可靠性,开启了 Checkpoint 以后,Flink 会按照必定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink 会将全部任务的状态恢复至最后一次发生 Checkpoint 中的状态,并从那里开始从新开始执行。

另外 Flink 还支持根据 Savepoint 从已中止做业的运行状态进行恢复,这种方式须要经过命令进行触发。

Flink 实现了本身的内存管理机制

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/…

专栏地址:gitbook.cn/gitchat/col…

博客

一、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七、阿里巴巴开源的 Blink 实时计算框架真香

2八、Flink 从0到1学习 —— Flink 中如何管理配置?

2九、Flink 从0到1学习—— Flink 不能够连续 Split(分流)?

30、Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

3一、Flink 架构、原理与部署测试

3二、为何说流处理即将来?

3三、OPPO 数据中台之基石:基于 Flink SQL 构建实时数据仓库

3四、流计算框架 Flink 与 Storm 的性能对比

3五、Flink状态管理和容错机制介绍

3六、Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理

3七、360深度实践:Flink与Storm协议级对比

3八、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了

3九、Apache Flink 1.9 重大特性提早解读

40、Flink 全网最全资源(视频、博客、PPT、入门、原理、实战、性能调优、源码解析、问答等持续更新)

4一、Flink 灵魂两百问,这谁顶得住?

4二、Flink 从0到1学习 —— 如何使用 Side Output 来分流?

4三、你公司到底需不须要引入实时计算引擎?

4四、一文让你完全了解大数据实时计算引擎 Flink

源码解析

一、Flink 源码解析 —— 源码编译运行

二、Flink 源码解析 —— 项目结构一览

三、Flink 源码解析—— local 模式启动流程

四、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 Annotations 源码解析

2七、Flink 源码解析 —— 如何获取 ExecutionGraph ?

2八、大数据重磅炸弹——实时计算框架 Flink

2九、Flink Checkpoint-轻量级分布式快照

30、Flink Clients 源码解析原文出处:zhisheng的博客,欢迎关注个人公众号:zhisheng

相关文章
相关标签/搜索