如何协调Flink中的流之间的速度?

时间:2018-04-22 07:59:34

标签: apache-flink flink-streaming flink-cep

我有一个原始日志流和一个如下所示的算法流。

enter image description here

如上所示,由于算法具有窗口,因此生成结果需要很长时间。原始日志流运行得太快,导致算法流的输出被丢弃,因为它远远落后于水印。

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

我有一个解决方法。

根据document,元素将在CEP中缓冲以等待水印。

所以我决定改变水印生成策略,如下所示。

public class UnionStreamTimestampExtractor implements AssignerWithPeriodicWatermarks<JSONObject> {
private long currentMaxTimestamp;
private boolean hasAlgoRule;

public UnionStreamTimestampExtractor(boolean hasAlgoRule) {
    this.hasAlgoRule = hasAlgoRule;
}

@Nullable
@Override
public Watermark getCurrentWatermark() {
    return new Watermark(currentMaxTimestamp);
}

@Override
public long extractTimestamp(JSONObject element, long previousElementTimestamp) {
    long timestamp = element.get("occur_time") == null ?
            element.getLong("timestamp") : element.getLong("occur_time");
    // if this entity has algorithm rule
    // let anomaly slice generate watermark, so that CEP can buffer raw log data to wait them.
    if (hasAlgoRule) {
        if (element.containsKey("tensor")) {
            currentMaxTimestamp = Math.max(timestamp, currentMaxTimestamp);
        }
    } else {
        currentMaxTimestamp = Math.max(timestamp, currentMaxTimestamp);
    }

    return timestamp;
}
}

但是它仍然存在问题,如果流的速度非常不同,则元素将会很多。