Flink Core 和 Flink CEP 在能力上有什么区别?
What is the difference between Flink Core and Flink CEP in respect of their capabilities?
这几天在研究 Flink CEP 库的过程中,给我的印象是它并没有在 Flink 的标准能力上增加任何新的基础功能。 Flink CEP 的唯一目的似乎就是让事件处理更简单,语义清晰,代码结构直观。例如,Flink CEP 仅呈现 5 semantics 的事件匹配跳过。尽管这些语义可能足以应对很大范围的情况,但它可能无法解决特定问题,这让我们 return 对 Flink 感到陌生。
测试用例是以下模式:
Emmit a alert(represented by 'a') for each non-overlapping pair of numbers in a stream
由模式表示:
Pattern.begin[EventType]("pair",skipStrategy).where(new AlwaysTrueFunction()).times(2)
因此,对于像(流中从左到右输入的数字)1 1 1 1 1
这样的输入,预期的输出将是 a a
,但跳过 5 个匹配项的 none策略会给出正确的结果:
No-skip: a a a a
Skip-to-next: a a a a
Skip-past-last-event: a a a a
Skip-to-first[1]: a a a a
Skip-to-last[1]: a a a a
尽管这些策略无法生成所需的模式,但可以使用 RichFunction
和 ValueState
计数器轻松确定何时应发出新警报,转换输入流在一连串的事件中。
因此,我希望对这些问题有所了解:
如果Flink看起来更完整,为什么要创建CEP库?
使用 CEP 制作的模式比使用 Flink 标准 DataStream 运算符制作的模式更有效(更大的 throughput/other 指标)?(如果可能的话,为 articles/papers/documentation 提供一些链接关于这个)
感谢您使用 Flink CEP。
Flink CEP 是 Flink 之上的库。因此,它不会添加任何无法使用 vanilla Flink 实现的功能(ProcessFunctions 等)。事实上,在幕后它是作为一个特殊的操作符来实现的,它正在检查与特定模式匹配的元素,它的大部分功能甚至可以作为 ProcessFunction 来实现(有很多工具)。
也就是说,Flink CEP 可能不会添加普通 Flink 无法实现的功能,但它增加了表现力,使一些用例更容易实现。其他 API 也是如此,例如 Flink 中的 Windowing API,您可以使用 ProcessFunctions(有很多工具)来实现它。
现在说到效率,答案是"it depends"。手工制作一个针对您的用例量身定制的特殊流程函数,并针对您的工作负载进行所有可能的优化,可能比 FlinkCEP 更高效,因为后者是一个通用库。如果您有专业知识和时间,那么最佳解决方案始终是同时使用(CEP 和 vanilla Flink)实施 PoC,并为您的案例选择最有效的。
这几天在研究 Flink CEP 库的过程中,给我的印象是它并没有在 Flink 的标准能力上增加任何新的基础功能。 Flink CEP 的唯一目的似乎就是让事件处理更简单,语义清晰,代码结构直观。例如,Flink CEP 仅呈现 5 semantics 的事件匹配跳过。尽管这些语义可能足以应对很大范围的情况,但它可能无法解决特定问题,这让我们 return 对 Flink 感到陌生。
测试用例是以下模式:
Emmit a alert(represented by 'a') for each non-overlapping pair of numbers in a stream
由模式表示:
Pattern.begin[EventType]("pair",skipStrategy).where(new AlwaysTrueFunction()).times(2)
因此,对于像(流中从左到右输入的数字)1 1 1 1 1
这样的输入,预期的输出将是 a a
,但跳过 5 个匹配项的 none策略会给出正确的结果:
No-skip: a a a a
Skip-to-next: a a a a
Skip-past-last-event: a a a a
Skip-to-first[1]: a a a a
Skip-to-last[1]: a a a a
尽管这些策略无法生成所需的模式,但可以使用 RichFunction
和 ValueState
计数器轻松确定何时应发出新警报,转换输入流在一连串的事件中。
因此,我希望对这些问题有所了解:
如果Flink看起来更完整,为什么要创建CEP库?
使用 CEP 制作的模式比使用 Flink 标准 DataStream 运算符制作的模式更有效(更大的 throughput/other 指标)?(如果可能的话,为 articles/papers/documentation 提供一些链接关于这个)
感谢您使用 Flink CEP。
Flink CEP 是 Flink 之上的库。因此,它不会添加任何无法使用 vanilla Flink 实现的功能(ProcessFunctions 等)。事实上,在幕后它是作为一个特殊的操作符来实现的,它正在检查与特定模式匹配的元素,它的大部分功能甚至可以作为 ProcessFunction 来实现(有很多工具)。
也就是说,Flink CEP 可能不会添加普通 Flink 无法实现的功能,但它增加了表现力,使一些用例更容易实现。其他 API 也是如此,例如 Flink 中的 Windowing API,您可以使用 ProcessFunctions(有很多工具)来实现它。
现在说到效率,答案是"it depends"。手工制作一个针对您的用例量身定制的特殊流程函数,并针对您的工作负载进行所有可能的优化,可能比 FlinkCEP 更高效,因为后者是一个通用库。如果您有专业知识和时间,那么最佳解决方案始终是同时使用(CEP 和 vanilla Flink)实施 PoC,并为您的案例选择最有效的。