Flink学习--知识梳理
一、Flink 基本介绍
1.1 Flink介绍:
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
1.2 Flik的应用场景:
- 电商和市场营销:实时报表、广告投放、实时推荐。
- 物联网:实时数据采集、实时报警。
- 物流配送及服务:订单状态跟踪、信息推送。
- 银行和金融业:实时结算、风险检测。
1.3 Flink的流处理特性
- 支持高吞吐、低延迟、高性能的流处理
- 支持带有事件时间的窗口操作
- 支持有状态计算的Exactly-one语义
- 支持高度灵活的窗口操作,支持基于time、count、session、以及data-driven的窗口操作
- 支持具有背压功能的持续流模型
- 支持基于轻量级分布式快照实现的容错
- 一个运行时同时支持Batch on Streaming处理和Streaming处理
- Flink在JVM内部实现了自己的内存管理
- 支持迭代计算
- 支持程序自动优化,避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存
1.4 Flink的优势
大数据的4代计算引擎
- 第一代:Hadoop、MapReduce批处理 Mapper、Reducer2
- 第二代:DAG框架(Oozie、Tez),Tez+MapReduce批处理
- 第三代:Spark批处理、流处理、SQL高层API支持 自带DAG 内存迭代计算、性能较之前大幅提升
- 第四代:Flink批处理、流处理、SQL高层API支持 自带DAG 流式计算性能更高、可靠性更高
表 1 Flink与Spark的差异
SparkStreaming |
Flink |
|
定义 |
弹性的分布式数据集,并非真正的实时计算 |
真正的流计算,就像storm一样;但flink同时支持有限的数据流计算(批处理) |
高容错 |
基于RDD和checkpoint,比较沉重 |
Checkpoint(快照),非常轻量级 |
内存管理 |
JVM相关操作暴露给用户 |
Flink在JVM中实现的是自己的内存管理 |
延时 |
中等100ms |
低10ms |
1.5 flink的四⼤基⽯
- checkpoint: 基于chandy-lamport算法实现分布式计算任务的⼀致性语义;
- state: flink中的状态机制,flflink天⽣⽀持state,state可以认为程序的中间计算结果或者是历史计算结果;
- time: flink中⽀持基于事件时间和处理时间进⾏计算,spark streaming只能按照process time进⾏处理;基于事件时间的计算我们可以解决数据迟到和乱序等问题。
- window: flink提供了更多丰富的window,基于时间,基于数量,session window,同样⽀持滚动和滑动窗⼝的计算。
1.6 Flink的流、批处理
- Flink将批处理视作一种特殊的流处理,Flink中的所有计算都是流式计算。
- Flink分别提供了面向流式处理的接口(DataStream API)和面向批处理的接口(DataSet API)
2.1 Flink的重要角色
JobManger处理器:
类似spark中master,负责资源申请,任务分发,任务调度执⾏,checkpoint的协调执⾏;可以搭建HA,双master。
TaskManager处理器:
类似spark中的worker,负责任务的执⾏,基于dataflflow(spark中DAG)划分出的task;与jobmanager保持⼼跳,汇报任务状态。
2.2 无界数据流与有界数据流
⽆界数据流:数据流是有⼀个开始但是没有结束;
有界数据流:数据流是有⼀个明确的开始和结束,数据流是有边界的。
Flink处理流批处理的思想是:
Flink支持的runtime(core 分布式流计算)支持的是无界数据流,但是对Flink来说可以支持批处理,只是从数据流上来说把有界数据流只是无界数据流的⼀个特例,无界数据流只要添加上边界就是有界数据流。
2.3 Flink的编程模型
Flink提供了不同的抽象级别以开发流式或者批处理应用。
最底层级的抽象仅仅提供了有状态流,他将通过过程函数(Process Function)被嵌入到DataStream API中。底层过程函数与DataStream API 相集成,使其可以对某些特定的操作进行底层的抽象,他允许用户可以自由地处理来自一个或者多个数据流的时间,并使用一致的容错的状态。除此之外,用户可以注册事件时间并处理时间回掉,从而使程序可以处理复杂的计算。
实际上,大多数应用并不需要上述的底层抽象,而是针对核心API(Core API)进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)。这些API为数据处理提供了通用的构建模块,比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows〉等等。DataSet API为有界数据集提供了额外的支持,例如循环与迭代。这些API处理的数据类型以类(classes)的形式由各自的编程语言所表示。
Table API是以表为中心的声明式编程,其中表可能会动态变化(在表达流数据时)。Table API遵循(扩展的)关系模型:表有二维数据结构(schema)(类似于关系数据库中的表),同时API提供可比较的操作,例如select、project、join、group_by、aggregate等。Table API程序声明式地定义了什么逻辑操作应该执行,而不是准确地确定这些操作代码的看上去如何。尽管Table API可以通过多种类型的用户自定义函数(UDF)进行扩展,其仍不如核心API更具有表达能了,但是使用起来却更加简洁。除此之外,Table API程序在执行之前会经过内置优化器进行优化。
Flink提供的最高层级的抽象是SQL。这一层抽象在语法与表达能力上与Table API类似,但是是以SQL查询表达式的形式表现程序。SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行。
- 点赞
- 收藏
- 关注作者
评论(0)