环境对象
分支主题
UDF中使用RuntimeContext
StreamingRuntimeContext:在流计算UDF中使用的上下文,用来访问作业信息、状态等。
DistributedRuntimeUDFContext:由运行时UDF所在的批处理算子创建,在DataSet批处理中使用。
RuntimeUDFContext:在批处理应用的UDF中使用。
SavepointRuntimeContext:Flink1.9版本引入了一个很重要的状态处理API,这个框架支持对检查点和保存点进行操作,包括读取、变更、写入等。
CepRuntimeContext:CEP复杂事件处理中使用的上下文。
main方法中使用StreamExecutionEnvironment
数据流元素
分支主题
StreamRecord
StreamRecord表示数据流中的一条记录(或者叫作一个事件),也叫作数据记录。
数据的值本身。
事件戳(可选)。
LatencyMarker
LatencyMarker用来近似评估延迟,LatencyMarker在Source中创建,并向下游发送,绕过业务处理逻辑,在Sink节点中使用LatencyMarker估计数据在整个DAG图中流转花费的时间,用来近似地评估总体上的处理延迟。
周期性地在数据源算子中创造出来的时间戳。
算子编号。
数据源算子所在的Task编号。
Watermark
Watermark是一个时间戳,用来告诉算子所有时间早于等于Watermark的事件或记录都已经到达,不会再有比Watermark更早的记录,算子可以根据Watermark触发窗口的计算、清理资源等。后边有详细介绍。
StreamStatus
用来通知Task是否会继续接收到上游的记录或者Watermark。StreamStatus在数据源算子中生成,向下游沿着Dataflow传播。
空闲状态(IDLE)。
活动状态(ACTIVE)
算子
算子在Flink中叫作StreamOperator。StreamOperator是流计算的算子。
算子行为
生命周期管理
setup:初始化环境、时间服务、注册监控等。
open:该行为由各个具体的算子负责实现,包含了算子的初始化逻辑,如状态初始化等。算子执行该方法之后,才会执行Function进行数据的处理。
close:所有的数据处理完毕之后关闭算子,此时需要确保将所有的缓存数据向下游发送。
dispose:该方法在算子生命周期的最后阶段执行,此时算子已经关闭,停止处理数据,进行资源的释放。
状态与容错管理
算子负责状态管理,提供状态存储,触发检查点的时候,保存状态快照,并且将快照异步保存到外部的分布式存储。当作业失败的时候算子负责从保存的快照中恢复状态。
数据处理
算子对数据的处理,不仅会进行数据记录的处理,同时也会提供对Watermark和LatencyMarker的处理。
Blink算子
Blink内置算子
Join
HashJoin
InnerHashJoinOperator
BuildOuterHashJoinOperator
BuildLeftSemiOrAntiHashJoinOperator
ProbeOuterHashJoinOperator
FullOuterHashJoinOperator
AntiHashJoinOperator
SemiHashJoinOperator
维表Join(Lookup Join)
TemporalProcessTimeJoinOperator
TemporalRowTimeJoinOperator
Sort算子
OverWindow算子
BufferDataOverWindowOperator:Over开窗运算经常需要用当前数据跟之前N条数据一起计算,所以需要采用将之前的数据缓存起来的方式,在内存不足的情况下会自动溢出到磁盘。
NonBufferOverWindowOperator:该算子应用于rank等不需要跟之前N条数据一起计算的开窗运算,无须缓存数据,可以提高计算效率。
Window算子
AggregateWindowOperator:使用普通聚合函数(UDAF)的窗口算子。
TableAggregateWindowOperator:使用表聚合函数(UDTAF)的窗口算子。
Watermark算子
WatermarkAssignerOperator:从数据元素中提取时间戳,周期性地生成Watermark。
RowTimeMiniBatchAssignerOperator:用在mini-batch模式下,依赖上游的Watermark,基于事件时间周期性地生成Watermark。
ProcTimeMiniBatchAssignerOperator:用在mini-batch模式下,基于处理时间周期性地生成Watermark,不依赖上游。
Mini-batch算子
Mini-batch算子用微批来提升计算效率,提高吞吐量。使用Java的Map来缓存数据,Map的Key与State的Key保持一致,在进行聚合运算的时候可以批量操作,避免每一条数据都访问State。
MapBundleOperator:应用于未按照Key分组的数据流。
KeyedMapBundleOperator:应用于按照Key分组后的数据流,即KeyedStream。
批上算子
SortOperator:实现批上的全局数据排序。
SortLimitOperator:实现批上的带有Limit的排序。
LimitOperator:实现批上的limit语义。
RankOperator:实现批上的Top N语义。
数据分区
分支主题
自定义分区
datasource.partitionCustom(new Partitioner<Object>() {
@Override
public int partition(Object key, int numPartitions) {
return 0;
}
}, new KeySelector<Tuple2<String, Integer>, Object>() {
@Override
public Object getKey(Tuple2<String, Integer> value) throws Exception {
return null;
}
})
ForwardPartitioner
该Partitioner比较特殊,用于在同一个OperatorChain中上下游算子之间的数据转发,实际上数据是直接传递给下游的。
ShufflePartitioner
随机将元素进行分区,可以确保下游的Task能够均匀地获得数据
ReblancePartitioner
以Round-robin的方式为每个元素分配分区,确保下游的Task可以均匀地获得数据,避免数据倾斜
RescalingPartitioner
根据上下游Task的数量进行分区。使用Round-robin选择下游的一个Task进行数据分区,如上游有2个Source,下游有6个Map,那么每个Source会分配3个固定的下游Map,不会向未分配给自己的分区写入数据。这一点与ShufflePartitioner和ReblancePartitioner不同,后两者会写入下游所有的分区
BroadcastPartitioner
将该记录广播给所有分区,即有N个分区,就把数据复制N份,每个分区1份
KeyGroupStreamPartitioner
KeyedStream根据KeyGroup索引编号进行分区,该分区器不是提供给用户来用的。