Flink基础
flink的安装:
如果为单机环境,直接从flink官网下载最新的flink包解压即可。
下载地址:https://flink.apache.org/downloads.html
flink可以存储中间结果、savepoints等信息,而存储的介质可以选择hadoop,所以这里下载<Apache Flink 1.7.1 with Hadoop® 2.8>
下载后,解压,然后执行bin下的start-cluster.sh即可启动
启动成功后,可以在浏览器中输入:http://localhost:8081就可以看到flink的管理控制台,如下:
flink_dashboard.png另外,如果只是单纯希望调试运行flink的job(使用main方法启动),其实可以不用安装flink环境,flink支持在IDE中直接以项目依赖包的形式运行,只是仅限于调试。
flink中所有job都是通过taskmanager来执行的,是否能立即执行,需要看有没有可用的slot。
一个job的生命周期是: CREATED -->【 SCHEDULED 】-->DEPLOYING --> RUNNING --> FINISHED
SCHEDULED 状态为可选
创建flink-java项目:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.7.0 \
-DgroupId=wiki-edits \
-DartifactId=wiki-edits \
-Dversion=0.1 \
-Dpackage=wikiedits \
-DinteractiveMode=false
Flink中的核心概念--入门版(更多的是DataStream API)
(仅根据目前接触到的一些核心概念做记录)
- DataStream: 数据流,flink中所有数据都以流的方式展现。
- StreamExecutionEnvironment: 流执行的环境,目前看到的很多例子都是通过创建这个对象来串联整体处理流程的。一般通过
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
这种方式来创建对象。
-
DataSource:数据源,通过env.addSource()来设置。一般可以从db、kafka等地方获取数据作为源。所有dataSource均需要继承 RichSourceFunction 这个抽象类,实现其中的open、close、run、cancel等方法。
-
Sink:沉淀、使下沉,在这里指将处理之后的数据存储起来的地方,一般可以放在redis、db、kafka等中,通过 dataSource.addSink()来设置,可以同时设置多个sink。如下:
dataStreamSource.addSink(new UrlMysqlSink()); dataStreamSource.addSink(new PrintSinkFunction<>());
其中PrintSinkFunction是直接输出到控制台,urlMysqlSink则是一个自定义的mysql sink。
自定义Sink需要继承 RichSinkFunction 这个抽象类,并实现其中的open、invoke方法。
-
Transformation:各种转换,输入一个或多个Stream,输出一个或者多个Stream,常用的transformation如下:
-
map:转换,类似于java8中stream的map,输入一个流,转换输出另外一个流
-
flatmap:与map类似,但是flat的意思是展开,也就是结果只有一层,不会有嵌套集合
flatmap中需要实现以下方法,可以看到输出的是collector,也就是只有一层集合,而不是嵌套。
void flatMap(T var1, Collector<O> var2) throws Exception;
-
reduce:返回单个的结果值,并且 reduce 操作每处理一个元素总是创建一个新值。可以用来实现average、sum、max、min、count等功能。
-
keyby:类似于sql中的group by,根据某个字段做分组操作,分组后才可以做更多后续的操作。返回的是一个KeyedStream<Object, Type-key> 的流,后面的是key类型。
-
filter:过滤器,其中需要实现的FilterFunction方法返回的是true/false,true代表数据会包含在返回数据中,false则当前数据会被过滤掉。
-
window:用来对一个无限的流设置一个有限的集合,在有界的数据集上进行操作的一种机制。window 又可以分为基于时间(Time-based)的 window 以及基于数量(Count-based)的 window。
-
tumbling time windows(翻滚时间窗口) -- 不会有窗口重叠,也就是一个元素只能出现在一个窗口中
-
sliding time windows(滑动时间窗口)--会有窗口重叠,也就是一个元素可以出现在多个窗口中
data.keyBy(1) .timeWindow(Time.minutes(1)) //tumbling time window 每分钟统计一次数量和 .sum(1); data.keyBy(1) .timeWindow(Time.minutes(1), Time.seconds(30)) //sliding time window 每隔 30s 统计过去一分钟的数量和 .sum(1);
-
-
timeWindow: 如上所说,根据时间来聚合流数据。例如:一分钟的 tumbling time window 收集一分钟的元素,并在一分钟过后对窗口中的所有元素应用于一个函数。
-
windowAll:
-
Aggregations:累积、聚合
- min/minBy:
- max/maxBy:
- sum:
-
union:
-
window join:
-
split:
-
select:
-
project:
-
网友评论