如何在flink作业中使用具有多个并行性的单例数据结构?

时间:2019-07-18 03:07:28

标签: apache parallel-processing apache-flink

我正在尝试在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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

在您的情况下,每个并行运算符将仅保留其自己的HashMap,但这在很大程度上取决于您的流的分区。有一个类似的问题解释了运营商here之间的通信。 如果出于某种原因您希望将流中的所有元素都保留在HashMap中并使用parallelism > 1。您可以在数据流上调用global(),这将导致流中的所有元素仅通过并行运算符的一个实例,这基本上将使您可以将所有流元素存储在HashMap中,但是请记住,这可能在吞吐量和延迟方面带来可怕的后果。

答案 1 :(得分:0)

您可以使用org.apache.flink.streaming.api.datastream.DataStream#windowAll方法将所有元素收集到全局窗口中。
参见this document