java - Flink 中广播状态有什么用?
问题描述
我不是在问广播模式的用途,而是具体的广播状态。在这个例子和这个例子中,每当广播的元素被处理时,它们被添加/放入广播状态:
public void processBroadcastElement(
Pattern pattern,
Context ctx,
Collector<Tuple2<Long, Pattern>> out) throws Exception
{
// store the new pattern by updating the broadcast state
BroadcastState<Void, Pattern> bcState = ctx.getBroadcastState(patternDesc);
// storing in MapState with null as VOID default value
bcState.put(null, pattern);
}
假设我们没有这样做,而是将 Pattern 添加到本地 List 或 HashMap。那会有什么问题?该文档说,每个并行实例以与其他实例相同的方式保持其自己的 BroadcastState 非常重要,以便在发生重新缩放时实现确定性行为。但在这种情况下,每个并行实例将始终需要所有模式,因此重新缩放时发生的任何事情都无关紧要。
我是不是误会了什么?
解决方案
使用本地状态而不是 Flink 管理的状态的问题在于它不能容错。当然,如果广播状态是静态的,重启时自己重新加载可能并不难。但在一般情况下,将广播状态与由 Flink 管理的其余状态一起存储在一个一致的状态存储中是很方便的。特别是如果广播状态正在不断更新。
推荐阅读
- python - Pandas 等效于带有列表/元组/迭代的 SQL 的“Where In”
- python - 程序的睡眠时间比预期的要长 - Python Tkinter
- r - 什么是几何形态学中的异速生长,使用 procD.lm 函数
- python - 使用标签更新 Tkinter 文本
- c++ - 循环包含在 MinGW 中的模板化函数
- load-testing - 将 Locust HTML 报告发送到 s3 存储桶
- google-cloud-platform - 检查 BigQuery 合并语句中的两个数组是否完全相同
- winforms - Webbrowser redirection issue C#
- python - How to build a path in my templates file for Django
- survey - 查找调查数据集的误差范围和显着性