Flink1.17 笔记
Flink1.17 笔记
Flink容错重启策略
https://blog.csdn.net/weixin_43871785/article/details/132096500
https://blog.csdn.net/dwjlyl/article/details/127466438



KAFKA配置参数说明
https://blog.csdn.net/weixin_45965698/article/details/108402354
https://blog.csdn.net/dream8062/article/details/54969820
flink 检查点
flink 水印
flink 广播变量
https://blog.csdn.net/yang_shibiao/article/details/118662134

https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/dev/datastream/fault-tolerance/broadcast_state/
https://blog.csdn.net/weixin_40659514/article/details/127258990
-
- 静态广播变量示例:
Broadcast(广播数据) :通过withBroadcastSet(DataSet, String) 进行广播数据,并给这份数据起名字
Access(获取数据):通过getRuntimeContext().getBroadcastVariable(String)获取广播出去的数据
使用场景如: 黑名单判断,将黑名单广播出去进行数据匹配。
注意:
- 静态广播变量示例:
1:广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大。因为广播出去的数据,会常驻内存,除非程序执行结束。
2:广播变量在初始化广播出去以后不支持修改,这样才能保证每个节点的数据都是一致的。
个人建议:如果数据集在几十兆或者百兆的时候,可以选择进行广播,如果数据集的大小上G的话,就不建议进行广播了。
-
- 动态广播变量示例:
使用场景: 数据依赖某些动态变化的处理规则
广播流一般都是从kafka或其他数据源获取,这里演示直接固定了。从kafka获取流,修改数据后,下游也会更新广播流。
key streaming 使用KeyedBroadcastProcessFunction.
非key streaming 使用 BroadcastProcessFunction.
- 动态广播变量示例:
Flink包含8中分区策略
https://www.cnblogs.com/jmx-bigdata/p/13708873.html
- GlobalPartitioner
- ShufflePartitioner
- RebalancePartitioner
- RescalePartitioner
- BroadcastPartitioner
- ForwardPartitioner
- KeyGroupStreamPartitioner
- CustomPartitionerWrapper
Flink Idle Source
flink 的 watermark 前进是靠数据推动的,如果没有数据进来,watermark 就无法前进。比如 kafka 一个 source subtask 消费了一个 partition,而这个 partition 没有数据,会导致这个 subtask watermark 一直不前进。这样的话,类似时间窗口这种算子就无法触发计算,这时候就需要 idle source 来解决这个问题。
source 有两种状态,idle 和 active。idle 状态是下游不需要等待这个流的 watermark;active 是正常运行状态。
例如一个 10 partition,source 并发为 10 的作业,source 之后接 keyby + window,假设一个 partition 0 突然没数据了:
如果没有将 partition 0 对应的 source 标记为 idle,下游 window 将一直没法触发计算,因为有一条流的 watermark 一直没前进。
如果将 partition 0 对应的 source 标记为 idle,这样下游 window 只需要等其他 9 个流 watermark 超过 window 上边界就可以触发计算。
在 SQL 中如何设置 Idle source:
通过 table.exec.source.idle-timeout 设置 source subtask 多久没有数据就自动置为 idle source. 例如 table.exec.source.idle-timeout = '30 s', 即 30s 没有数据,该 subtask 会置为 idle. 一旦后续该 subtask 有数据过来,又会变为 active 状态。
需要特别注意的是,这个配置在某些情况下可能会导致数据丢失. 例如有一个 partition 由于某些原因一直没有读到数据,idle-timeout 时间之后,下游将不再等这个 source subtask 的 watermark,这样下游的 watermark 将会前进,如果这个 partition 后续正常读到了数据,可能会因为比 watermark 晚而丢弃。
二、watermark不更新怎么办?
如果有一个source一直没有事件流入,会发生什么?
因为没有任何事件流入,Flink流处理系统时钟将无法运作。source的这种情况,把它称之为IDLE source(空闲source)。在这种情况下,会因为某个task时钟没有推进,从而导致window无法触发计算。
在Flink中,我们可以使用withIdleness来设置空闲的source。
SingleOutputStreamOperator<Tuple2<String, Long>> wordWithTsDS =
wordSource.assignTimestampsAndWatermarks(WatermarkStrategy
.<Tuple2<String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 设置水印允许延迟5秒
.withIdleness(Duration.ofSeconds(15)) // 设置空闲source为15秒
.withTimestampAssigner((event, timestamp) -> event.f1)); // 提取事件时间
这样,在window计算的时候,如果某个source超过15秒没有事件流入,就会被标记为IDLE source,window在计算watermark的时候,会忽略该source。
https://blog.csdn.net/weixin_32880357/article/details/112996771
https://blog.csdn.net/a772304419/article/details/132664670
Scala Random
以下是一个Scala中使用Random类的示例:
import scala.util.Random
object RandomDemo extends App {
val random = new Random()
// 生成一个随机的整数
val randomInt: Int = random.nextInt()
// 生成一个随机的浮点数
val randomDouble: Double = random.nextDouble()
// 生成一个随机的布尔值
val randomBoolean: Boolean = random.nextBoolean()
// 生成一个随机的字符
val randomChar: Char = random.nextPrintableChar()
// 生成一个随机的字符串
val randomString: String = random.alphanumeric.take(10).mkString
println(s"随机整数: $randomInt")
println(s"随机浮点数: $randomDouble")
println(s"随机布尔值: $randomBoolean")
println(s"随机字符: $randomChar")
println(s"随机字符串: $randomString")
}
这个示例展示了如何使用Random类生成随机的整数、浮点数、布尔值、字符和字符串。
Windows/Linux 使用 split 命令分割大文件
https://www.qyyshop.com/info/621705.html
Windows/Linux 使用 split 命令分割大文件
https://www.zhangbj.com/p/337.html
参考
https://blog.csdn.net/qq_42009405/article/details/127262065
https://blog.csdn.net/qq_35514685/article/details/123232738

浙公网安备 33010602011771号