Transformation 数据流转换算子
Map
- map可以理解为映射,对每个元素进行一定的变换后,映射为另一个元素。
FlatMap
- flatmap可以理解为将元素摊平,每个元素可以变为0个、1个、或者多个元素。
Filter
- filter是进行筛选 为每个元素评估一个布尔函数,并保留该函数返回true的布尔函数。过滤出零值的过滤器。
KeyBy
- 逻辑上将Stream根据指定的Key进行分区,是根据key的散列值进行分区的。在内部,keyBy()是通过哈希分区实现的。有多种指定密钥的方法。
- 此转换返回一个KeyedStream,除其他事项外,还需要使用keyed state。
在以下情况下,类型不能为键:是POJO类型,但不覆盖hashCode()方法,而是依赖于Object.hashCode()实现。它是任何类型的数组。
Reduce
- reduce是归并操作,它可以将KeyedStream 转变为 DataStream。对每一组内的元素进行归并操作,即第一个和第二个归并,结果再与第三个归并......
Aggregations聚合
- 在键控数据流上滚动聚合。min和minBy之间的区别在于min返回最小值,而minBy返回在此字段中具有最小值的元素(与max和maxBy相同)。
Window
- 可以在已经分区的KeyedStreams上定义Windows。Windows根据某些特征(例如,最近5秒钟内到达的数据)将每个键中的数据分组。
WindowAll
- Windows可以在常规DataStreams上定义。Windows根据某些特征(例如,最近5秒钟内到达的数据)将所有流事件分组。
Window Apply 窗口应用
- 将一般功能应用于整个窗口。以下是一个手动汇总窗口元素的函数
Window Reduce 窗口缩小
- 将功能化的reduce函数应用于窗口,并返回缩减后的值
Aggregations on windows
- 聚合窗口的内容。min和minBy之间的区别在于min返回最小值,而minBy返回在此字段中具有最小值的元素(与max和maxBy相同)
Union 联合数据流
- union可以将多个流合并到一个流中,以便对合并的流进行统一处理。是对多个流的水平拼接。
- 参与合并的流必须是同一种类型
DataStream<String> mapStream9000=textStream9000.map(s->"来自9000端口:"+s);
DataStream<String> mapStream9001=textStream9001.map(s->"来自9001端口:"+s);
DataStream<String> mapStream9002=textStream9002.map(s->"来自9002端口:"+s);
//union用来合并两个或者多个流的数据,统一到一个流中
DataStream<String> result = mapStream9000.union(mapStream9001,mapStream9002);
Window Join 窗口联接
- 在给定key和一个公共窗口上连接两个数据流。
Interval Join 间隔加入
- 在给定的时间间隔内,使用公共密钥将两个键控流的两个元素e1和e2连接起来,从而使e1.timestamp + lowerBound <= e2.timestamp <= e1.timestamp + upperBound
Window CoGroup
- 在给定的键和一个公共窗口上将两个数据流组合在一起。
Connect 连接
- “连接”两个保留其类型的数据流。连接允许两个流之间共享状态。
- 将两个流纵向地连接起来。DataStream的connect操作创建的是ConnectedStreams或BroadcastConnectedStream,它用了两个泛型,即不要求两个dataStream的element是同一类型。
CoMap, CoFlatMap
- 关联两个流,关联不上的也保留下来 与连接的数据流上的map和flatMap相似
Iterate 迭代数据流
- 通过将一个运算符的输出重定向到某个先前的运算符,在流中创建“反馈”循环。这对于定义不断更新模型的算法特别有用。以下代码从流开始,并连续应用迭代主体。大于0的元素将被发送回反馈通道,其余元素将被转发到下游。
project(2,0)
- 从元组类型的数据流中抽取元组中部分元素
DataStream<Tuple3<Integer, Double, String>> in = // [...]
DataStream<Tuple2<String, Integer>> out = in.project(2,0);
物理分区
partitionCustom 自定义分区
- 使用用户定义的分区程序为每个元素选择目标任务。
dataStream.partitionCustom(partitioner, "someKey");
dataStream.partitionCustom(partitioner, 0);
shuffle() 随机分区
- 根据均匀分布对元素进行随机划分。
dataStream.shuffle();
rebalance() 重新平衡(轮询分区)
- 分区元素轮循,从而为每个分区创建相等的负载。在存在数据偏斜的情况下对性能优化很有用。
dataStream.rebalance();
Flink也有数据倾斜的时候,比如当前有数据量大概10亿条数据需要处理,在处理过程中可能会发生如图所示的状况:
这个时候本来总体数据量只需要10分钟解决的问题,出现了数据倾斜,机器1上的任务需要4个小时才能完成,那么其他3台机器执行完毕也要等待机器1执行完毕后才算整体将任务完成;所以在实际的工作中,出现这种情况比较好的解决方案就是接下来要介绍的—rebalance(内部使用round robin方法将数据均匀打散。这对于数据倾斜时是很好的选择。)
rescale() 重新缩放
-
将元素循环地分配到下游操作的子集。如果您希望拥有管道,例如,将其从源的每个并行实例散开到几个映射器的子集以分配负载,但又不希望rebalance()引起全部重新平衡,则这很有用。这将仅需要本地数据传输,而不需要通过网络传输数据,具体取决于其他配置值,例如TaskManager的插槽数。
-
上游操作向其发送元素的下游操作的子集取决于上游操作和下游操作两者的并行度。例如,如果上游操作具有并行度2,而下游操作具有并行度6,则一个上游操作将元素分配给三个下游操作,而另一个上游操作将分配给其他三个下游操作。另一方面,如果下游操作具有并行性2,而上游操作具有并行性6,则三个上游操作将分配给一个下游操作,而其他三个上游操作将分配给另一个下游操作。
-
如果不同的并行度不是彼此的倍数,则一个或几个下游操作将具有与上游操作不同的输入数量。
dataStream.rescale();
broadcast() 广播数据流
- 将元素广播到每个分区。
dataStream.broadcast();
算子链和资源组
startNewChain() 开始新链接
- 以当前 operator 为起点开始新的连接。如下的两个 mapper 算子会链接在一起而 filter 算子则不会和第一个 mapper 算子进行链接。
someStream.filter(...).map(...).startNewChain().map(...);
disableChaining() 禁用链接
- 任何算子不能和当前算子进行链接
someStream.map(...).disableChaining();
slotSharingGroup("name") 设置广告位共享组
- 配置算子的资源组。Flink 会将相同资源组的算子放置到同一个 slot 槽中执行,并将不同资源组的算子分配到不同的 slot 槽中,从而实现 slot 槽隔离。资源组将从输入算子开始继承如果所有输入操作都在同一个资源组。 Flink 默认的资源组名称为 "default",算子可以显式调用 slotSharingGroup("default") 加入到这个资源组中。
someStream.filter(...).slotSharingGroup("name");
参考:
https://blog.csdn.net/qq_34387470/article/details/115389804
https://blog.51cto.com/u_15127536/2658929
https://blog.csdn.net/zhanglong_4444/article/details/114000627
网友评论