文章目录
前言
前无言
一、Partition分区(物理分区)
1.1 随机分区 shuffle
随机分区(在 1 号线程和 2 号线程所在分区 随机输出),逻辑实现方法是:random.nextInt(下游算子并行度)
1.2 轮询分区 rebalance
如果是数据源倾斜的场景,source 后,调用 rebalance就可以解决数据源的倾斜问题
1.3 重缩放分区 rescale
rescale缩放:实现轮询,局部组队,比reblance更高效
1.4 广播分区 broadcast
发给下游所有的子任务,有几个并行子任务就发几个
1.5 全局分区 global
全部发往第一个子任务
1.6 keyby
按照指定 key 去发送,相同 key 发往同一个子任务。
one-to-one:Forward 分区器
1.7 自定义分区 Custom
二、transform
2.1 flatMap
flatMap()的输出可以是零个、一个或多个元素。通过 Collector来输出, 调用几次就输出几条。该方法的返参是 void。当输出元素是一个列表时,flatMap()会将列表展平。
2.2 filter
过滤,true 保留
2.3 RichFunction
RichMapFunction类是一种RichFunction类,它除了提供MapFunction类的基础功能,还提供了一系列其他方法,包括open()、close()、getRuntimeContext()和setRuntimeContext()等方法,重写这些方法可以创建状态数据、对数据进行广播、获取累加器和计数器等。
- Rich 类函数多了声明周期管理方法
- open():每个子任务,在启动前,调用一次
- close():每个子任务,在结束时,调用一次
- 如果是 flink 程序异常挂掉,不会调用 close
- 如果是正常调用 cancel 命令,可以 close
- 多一个运行时上下文
可以获取一些运行时的环境行信息,比如子任务编号、名称,等其他。
2.4 map
一进一出。
map()对一个DataStream中的每个元素使用用户自定义的Mapper函数进行处理,每个输入元素对应一个输出元素,最终整个数据流被转换成一个新的DataStream。