文章目录
Flink 概述
Flink 是什么
有界流和无界流
- 无界数据流:
- 有定义流的开始,但没有定义流的结束;
- 它们会无休止的产生数据:
- 无界流的数据必须持续处理,即数据被摄取后需要立刻处理我们不能等到所有数据都到达再处理,因为输入是无限的。
- 有界数据流:
- 有定义流的开始,也有定义流的结束:
- 有界流可以在摄取所有数据后再进行计算:
- 有界流所有数据可以被排序,所以并不需要有序摄取:
- 有界流处理通常被称为批处理
有状态流处理
把流处理需要的额外数据保存成一个状态,然后针对这条数据进行处理,并且更新状态。这就是所谓的"有状态的流处理"
- 状态在内存中:优点:速度快 ;缺点:可靠性差
- 状态在分布式系统中:优点:可靠性高;缺点:速度慢
Flink 特点
- 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
- 结果的准确性。Flink提供了事件时间(event-time)和处理时间(processing-time)语义对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
- 精确一次(exactly-once)的状态一致性保证。
- 可以连接到最常用的外部系统,如Kata、Hive、JDBC、HDFS、Redis等
- 高可用。本身高可用的设置,加上与K8S,YARN和Mesos的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Fhnk能做到以极少的停机时间7x24全天候运行。
Flink vs SparkStreaming
Flink 分层API
- 有状态流处理:通过底层API(处理函数),对最原始数据加工处理。底层API与DataSstrea API相集成,可以处理复杂的计算。
- DataStream API(流处理)和DataSet API(批处理)封装了底层处理函数,提供了通用的模块,比如转换(transormations,包括map、flatmap等),连接(joms),聚合(aggregations),窗口(windows)操作等。注意:Flimk1.12以后,DataStream API已经实现真正的流批一体,所以DataSet API已经过时
- Table API 是以表为中心的声明式编程,其中表可能会动态变化。Ible API遵循关系模型:表有二维数据结构,类似于关系数据库中的表;同时API提供可比较的操作,例如select、project、jomn、group-by、aggregate等。我们可以在表与 DataStream/Dataset 之间无缝切换,以允许程序将 Table AP与DataStream 以及 DataSet 混合使用。
- SOL这一层在语法与表达能力上与 Table API类似,但是是以SOL查询表达式的形式表现程序。SOL抽象与Table API交互密切,同上心能有难区的时SOL查询可以直接在Table API定义的表上执行。
Flink 快速上手
-
在IDEA中创建Maven项目
-
添加项目依赖
<properties> <flink.version>1.17.0</flink.version> </properties> <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${ flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>${ flink.version}</version> </dependency> </dependencies>
WordCount 代码编写
批处理
批处理基本思路:先逐行读入文件数据,然后将每一行文字拆分成单词;接着按照单词分组,统计每组数据的个数,就是对应单词的频次。
1)数据准备
(1)在工程根目录下新建一个input文件夹,并在下面创建文本文件words.txt
(2)在words.txt中输入一些文字,例如:
hello flink
hello world
hello java
2)代码编写
(1)在com.yudan.wc包下新建Java类BatchWordCount,在静态main方法中编写代码。具体代码实现如下:
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators