Flink上的非阻塞流式传输

时间:2017-12-06 09:16:05

标签: apache-flink

嗨,我正在尝试运行一个应该处理传入数据的Flink作业,如下所示。在keyBy()之后的流程操作符中,应该存在根据数据中的某些属性花费太多时间的情况。即使传入数据具有不同的ID(用于keyBy()流),处理功能中的长处理代码也会阻止其他传入数据。我的意思是整个流。

SingleOutputStreamOperator<Envelope> processingStream = deviceStream
    .map(e -> (Envelope) e)
    .keyBy((KeySelector<Envelope, String>) value -> value.eventId) // key by scenarios
    .process(new RuleProcessFunction());

RuleProcessFunction.java

...
@Override
public void processElement(Envelope value, Context ctx, Collector<Envelope> out) throws Exception {
    //handleEvent(value, ctx, out);
    if (value.getEventId().equals("I")) {
        System.out.println("hello i");
        for (long i = 0; i < 10000000000L; i++) {

        }
    }
    out.collect(value);
}

我希望长时间运行的代码块不应该阻塞整个流。我知道有AsyncFunction用于阻止IO情况,但我不知道这是正确的解决方案。

1 个答案:

答案 0 :(得分:0)

由于您没有从像Cassandra这样的外部数据库中提取数据,因此我认为您不需要使用AsyncFunction。

使用单一并行操作运行flink作业可能是什么。尝试增加并行性,以便一个核心不负责所有处理以及接收数据。当然,如果你这样做,仍然会有背压。因为负责从源获取数据的核心读取数据的速度比正在运行processFunction的核心更快,因此Flink的背压处理将减慢摄取速度。