Flink的世界观是数据流

对 Flink ⽽⾔,其所要处理的主要场景就是流数据,批数据只是流数据的⼀个极限特例⽽已,所以 Flink 也是⼀款真正的流批统⼀的计算引擎

Unbounded streams?Bounded streams?

无界流与有界流
image.png

stateful computations?

有状态的计算:每次进行数据计算的时候基于之前数据的计算结果(状态)做计算,并且每次计算结果 都会保存到存储介质中,计算关联上下文context
基于有状态的计算不需要将历史数据重新计算,提高了计算效率
无状态的计算:每次进行数据计算只是考虑当前数据,不会使用之前数据的计算结果
image.png

Flink流处理特性

1) 支持高吞吐、低延迟、高性能的流处理
2) 支持带有事件时间的窗口(Window)操作
3) 支持有状态计算的Exactly-once语义
4) 支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作
5) 支持具有Backpressure功能的持续流模型
6) 支持基于轻量级分布式快照(Snapshot)实现的容错
7) 一个运行时同时支持Batch on Streaming处理和Streaming处理
8) Flink在JVM内部实现了自己的内存管理
9) 支持迭代计算
10) 支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存

Flink技术栈的核心组成

Flink技术栈的核心组成.png

Flink数据流编程模型

数据流模型.jpg

DataSet

处理批数据

DataStream

处理流数据

Libraries支持

支持机器学习(FlinkML)
支持图分析(Gelly)
支持关系数据处理(Table)
支持复杂事件处理(CEP)

整合支持

支持Flink on YARN
支持HDFS
支持来自Kafka的输入数据
支持Apache HBase
支持Hadoop程序
支持Tachyon
支持ElasticSearch
支持RabbitMQ
支持Apache Storm
支持S3
支持XtreemFS

Dataflows数据流图

在Flink的世界观中,一切都是数据流,所以对于批计算来说,那只是流计算的一个特例而已
Flink Dataflows是由三部分组成,分别是:source、transformation、sink结束
source数据源会源源不断的产生数据,transformation将产生的数据进行各种业务逻辑的数据处理,最 终由sink输出到外部(console、kafka、redis、DB......)
基于Flink开发的程序都能够映射成一个Dataflows

当source数据源的数量比较大或计算逻辑相对比较复杂的情况下,需要提高并行度来处理数据,采用并 行数据流
通过设置不同算子的并行度 source并行度设置为2,map也是2.... 代表会启动多个并行的线程来处理数据

Dataflows 算子链

为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接(chain)在一起形成task。每个 task在一个线程中执行。将operators链接成task是非常有效的优化:它能减少线程之间的切换,减少 消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量

运行打包注意点:

如果要将程序打包提交到集群运行,打包的时候不需要包含这些依赖,因为集群环境已经包含这些依赖,此时依赖的作用域应该设置为provided provided
Flink 应用在 IntelliJ IDEA 中运行,这些 Flink 核心依赖的作用域需要设置为 compile 而不是 provided 。 否则 IntelliJ 不会添加这些依赖到 classpath,会导致应用运行时抛出 NoClassDefFountError异常


MosesDon
7 声望1 粉丝