使用Flink CEP

时间:2019-01-21 16:11:38

标签: apache-flink flink-cep

我已经用Flink CEP实现了一个模式,该模式与三个事件(例如A->B->C)匹配。定义模式后,我将生成一个

PatternStream<Event> patternStream = CEP.pattern(eventStream, pattern);

PatternSelectFunction这样

patternStream.select(new MyPatternSelectFunction()).print();

这就像一个咒语,但是我对所有匹配事件的事件时间都感兴趣。我知道传统的Flink流API提供了丰富的功能,可让您按照本question中的说明注册Flink的内部延迟跟踪器。我还看到,对于Flink 1.8,添加了新的RichPatternSelectFunction。但是很遗憾,我无法使用Flink CEP设置Flink 1.8。

最后,有没有办法获取所有匹配事件的事件时间?

1 个答案:

答案 0 :(得分:1)

您不需要Rich Function即可使用Flink的延迟跟踪。您只需要通过在Flink配置或ExecutionConfig中将latencyTrackingInterval设置为正数来启用它,例如

env.getConfig().setLatencyTrackingInterval(1000);

然后您可以在指标解决方案中或通过REST API观察结果(Flink Web UI中不报告延迟指标)。

Documentation

更新:

潜伏期统计信息是作业指标,在由...返回的列表中

http://<job_manager_rest_endpoint>/jobs/<job_id>/metrics

可以从中获取延迟指标值

http://<job_manager_rest_endpoint>/jobs/<job_id>/metrics?get=<metric_name>

这些指标的名称类似

latency.source_id.<ID>.operator_id.<ID>.operator_subtask_index.<SUBTASK>.<metric>

其中,ID标识作业图中正在测量延迟之间的源节点和操作员节点。

例如,通过此请求,我可以确定当前正在运行的作业中源与接收器之间的第95个百分位延迟:

http://localhost:8081/jobs/94b189a96b98b3aafaba6db6aa8b770b/metrics?get=latency.source_id.bc764cd8ddf7a0cff126f51c16239658.operator_id.fd0ee602f2fa8d310d9bd9f694e185f5.operator_subtask_index.0.latency_p95

或者,您可以使用ProcessFunction在事件进入工作的CEP部分之前为事件添加处理时间时间戳,然后再使用另一个ProcessFunction来测量经过的时间。