我正在尝试在flink作业的窗口函数中使用HashMap。如果并行性发生变化,此哈希图是否仍然是单例?我不应该在这里做类似的事情吗?
public class SeewoUserWindowFunction implements WindowFunction<ObjectNode, LabelInfo, String, TimeWindow> {
private static final Logger logger = LoggerFactory.getLogger(SeewoUserWindowFunction.class);
@Override
public void apply(String s, TimeWindow timeWindow, Iterable<ObjectNode> iterable, Collector<LabelInfo> collector) throws Exception {
try {
HashMap<String, LabelInfo> result = new HashMap<>();
iterable.forEach(e -> {
String key = e.get("value").get("$tid").toString() + "/" + e.get("value").get("$code").toString();
if (result.containsKey(key)) {
result.put(key, result.get(key).update(e, timeWindow.getEnd()));
} else {
result.put(key, LabelInfo.of(e, timeWindow.getEnd()));
}
});
result.values().stream().forEach(labelInfo -> collector.collect(labelInfo));
} catch (Exception exception) {
logger.error("parse exception!", exception);
}
}
}
答案 0 :(得分:0)
在您的情况下,每个并行运算符将仅保留其自己的HashMap
,但这在很大程度上取决于您的流的分区。有一个类似的问题解释了运营商here之间的通信。
如果出于某种原因您希望将流中的所有元素都保留在HashMap
中并使用parallelism > 1
。您可以在数据流上调用global()
,这将导致流中的所有元素仅通过并行运算符的一个实例,这基本上将使您可以将所有流元素存储在HashMap
中,但是请记住,这可能在吞吐量和延迟方面带来可怕的后果。
答案 1 :(得分:0)
您可以使用org.apache.flink.streaming.api.datastream.DataStream#windowAll
方法将所有元素收集到全局窗口中。
参见this document。